XUtils===XUtils3框架的基本使用方法

转载自:http://blog.csdn.NET/a1002450926/article/details/50341173

今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示。相信大家对这个框架也都了解过,下面简单介绍下XUtils3的一些基本知识。

XUtils3一共有4大功能:注解模块,网络模块,图片加载模块,数据库模块。

使用XUtils只需要在libs文件夹里面加入一个jar包,如果对服务器返回的数据进行封装的话,还需要导入一个Gson的jar包。

  1. <uses-permission android:name="android.permission.INTERNET" />    
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

 

注解模块

Activity的注解
1.在Application的oncreate方法中加入下面代码:
x.Ext.init(this);
2.在Activity的oncreate方法中加入下面代码:
x.view().inject(this);
3.加载当前的Activity布局需要如下注解:
@ContentView加入到Activity的上方
4.给View进行初始化需要如下注解:
@InjectView
5.处理控件的各种响应事件需要如下注解:
@Envent

  1. @ContentView(R.layout.activity_main)  
  2. public class MainActivity extends ActionBarActivity {  
  3.   
  4.     @ViewInject(R.id.btn_get)  
  5.     Button btn_get;  
  6.     @ViewInject(R.id.btn_post)  
  7.     Button btn_post;  
  8.   
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         x.view().inject(this);  
  13.   
  14.         btn_get.setText("发送get请求");  
  15.         btn_post.setText("发送post请求");  
  16.     }  
  17.     //等同于@Event(value={R.id.btn_get,R.id.btn_post},type=View.OnClickListener.class)  
  18.     @Event(value={R.id.btn_get,R.id.btn_post})  
  19.     private void getEvent(View view){  
  20.         switch(view.getId()){  
  21.         case R.id.btn_get:  
  22.             Toast.makeText(MainActivity.this, btn_get.getText().toString().trim(), 0).show();  
  23.             break;  
  24.         case R.id.btn_post:  
  25.             Toast.makeText(MainActivity.this, btn_post.getText().toString().trim(), 0).show();  
  26.             break;  
  27.         }  
  28.     }  


通过测试,我们发现当点击btn_get按钮时,弹出了“发送get请求”的效果。到这里,大家算是对XUtils的注解有个一个基本的认识,下面我在强调一点的是,@Event这个注解默认情况下type属性为View.OnClickListener.class.如果你想实现其余点击事件效果,只需要把type值进行修改即可。
另外需要注意的一点是按钮的点击事件必须用private进行修饰。

Fragment的注解:

  1. @ContentView(R.layout.fragment_first)    
  2. public class FirstFragment extends Fragment{    
  3.     private MyAdapter adapter;  
  4.     private List<Person> list=new ArrayList<>();    
  5.     private List<String> listUrl=new ArrayList<>();    
  6.     private List<String> listName=new ArrayList<>();      
  7.   
  8.     @ViewInject(R.id.btn_test)  
  9.     Button btn_test;  
  10.     @ViewInject(R.id.listView)  
  11.     ListView listView;  
  12.   
  13.     @Override  
  14.     public View onCreateView(LayoutInflater inflater,  
  15.             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {  
  16.         return  x.view().inject(this, inflater, container);  
  17.     }   


ViewHolder的注解:

  1. public class MyAdapter extends  BaseAdapter{  
  2.     private Context context;  
  3.     private List<Person> list;  
  4.     private LayoutInflater mInflater;  
  5.     private ImageOptions options;  
  6.     public ViewHolder holder;  
  7.     public MyAdapter(Context context, List<Person> list) {  
  8.         this.context = context;  
  9.         this.list = list;  
  10.         this.mInflater=LayoutInflater.from(context);  
  11.         options=new ImageOptions.Builder().setLoadingDrawableId(R.drawable.ic_launcher)  
  12.                 .setLoadingDrawableId(R.drawable.ic_launcher).setUseMemCache(true).setCircular(true).build();  
  13.     }  
  14.   
  15.     @Override  
  16.     public int getCount() {  
  17.         return list.size();  
  18.     }  
  19.   
  20.     @Override  
  21.     public Object getItem(int position) {  
  22.         return list.get(position);  
  23.     }  
  24.   
  25.     @Override  
  26.     public long getItemId(int position) {  
  27.         return position;  
  28.     }  
  29.   
  30.     @Override  
  31.     public View getView(int position, View convertView, ViewGroup parent) {  
  32.         holder=null;  
  33.         if(convertView==null){  
  34.             convertView=mInflater.inflate(R.layout.itemone, null);  
  35.             holder=new ViewHolder();  
  36.             x.view().inject(holder,convertView);  
  37.             convertView.setTag(holder);  
  38.         }  
  39.         else{  
  40.             holder=(ViewHolder) convertView.getTag();  
  41.         }  
  42.         Person bean=list.get(position);  
  43.         holder.tv_name.setText(bean.getName());  
  44.         x.image().bind(holder.iv_image, bean.getImgUrl(), options);  
  45.         return convertView;  
  46.     }  
  47.   
  48.     class ViewHolder{  
  49.         @ViewInject(R.id.tv_name)  
  50.         private TextView tv_name;  
  51.         @ViewInject(R.id.iv_image)  
  52.         private ImageView iv_image;  
  53.     }  

 

上面的代码是注解ViewHolder的标准模式,相信大家完全能够看明白。这里我加载图片使用到了XUtils3的加载网络图片的方法。后面我会详细进行讲解。

网络模块

XUtils的网络请求方法和一些网络请求框架的用法非常类似,我进行了一些简单的封装。
封装一共有3个文件,分别是网络请求工具类XUtil,请求响应数据的解析类,还有一个就是一个请求成功的一个接口回调类。
代码如下:

  1. public class XUtil {  
  2.     /** 
  3.      * 发送get请求 
  4.      * @param <T> 
  5.      */  
  6.     public static <T> Cancelable Get(String url,Map<String,String> map,CommonCallback<T> callback){  
  7.         RequestParams params=new RequestParams(url);  
  8.         if(null!=map){  
  9.             for(Map.Entry<String, String> entry : map.entrySet()){  
  10.                 params.addQueryStringParameter(entry.getKey(), entry.getValue());  
  11.             }  
  12.         }  
  13.         Cancelable cancelable = x.http().get(params, callback);  
  14.         return cancelable;  
  15.     }  
  16.   
  17.     /** 
  18.      * 发送post请求 
  19.      * @param <T> 
  20.      */  
  21.     public static <T> Cancelable Post(String url,Object> map,CommonCallback<T> callback){  
  22.         RequestParams params=new RequestParams(url);  
  23.         if(null!=map){  
  24.             for(Map.Entry<String, Object> entry : map.entrySet()){  
  25.                 params.addParameter(entry.getKey(), entry.getValue());  
  26.             }  
  27.         }  
  28.         Cancelable cancelable = x.http().post(params, callback);  
  29.         return cancelable;  
  30.     }  
  31.   
  32.   
  33.     /** 
  34.      * 上传文件 
  35.      * @param <T> 
  36.      */  
  37.     public static <T> Cancelable UpLoadFile(String url, entry.getValue());  
  38.             }  
  39.         }  
  40.         params.setMultipart(true);  
  41.         Cancelable cancelable = x.http().get(params, callback);  
  42.         return cancelable;  
  43.     }  
  44.   
  45.     /** 
  46.      * 下载文件 
  47.      * @param <T> 
  48.      */  
  49.     public static <T> Cancelable DownLoadFile(String url,String filepath,CommonCallback<T> callback){  
  50.         RequestParams params=new RequestParams(url);  
  51.         //设置断点续传  
  52.         params.setAutoResume(true);  
  53.         params.setSaveFilePath(filepath);  
  54.         Cancelable cancelable = x.http().get(params, callback);  
  55.         return cancelable;  
  56.     }  
  57. }  
  58.   
  59.   
  60. public class JsonResponseParser implements ResponseParser {  
  61.     //检查服务器返回的响应头信息  
  62.     @Override  
  63.     public void checkResponse(UriRequest request) throws Throwable {  
  64.     }  
  65.   
  66.     /** 
  67.      * 转换result为resultType类型的对象 
  68.      * 
  69.      * @param resultType  返回值类型(可能带有泛型信息) 
  70.      * @param resultClass 返回值类型 
  71.      * @param result      字符串数据 
  72.      * @return 
  73.      * @throws Throwable 
  74.      */  
  75.     @Override  
  76.     public Object parse(Type resultType, Class<?> resultClass, String result) throws Throwable {  
  77.         return new Gson().fromJson(result, resultClass);  
  78.     }  
  79. }  
  80.   
  81.   
  82. public class MyCallBack<ResultType> implements Callback.CommonCallback<ResultType>{  
  83.   
  84.     @Override  
  85.     public void onSuccess(ResultType result) {  
  86.         //可以根据公司的需求进行统一的请求成功的逻辑处理  
  87.     }  
  88.   
  89.     @Override  
  90.     public void onError(Throwable ex, boolean isOnCallback) {  
  91.         //可以根据公司的需求进行统一的请求网络失败的逻辑处理  
  92.     }  
  93.   
  94.     @Override  
  95.     public void onCancelled(CancelledException cex) {  
  96.   
  97.     }  
  98.   
  99.     @Override  
  100.     public void onFinished() {  
  101.   
  102.     }  
  103.   
  104.   
  105. }  

1.发送get请求示例:

  1. //本get请求来自于免费测试接口:http://www.k780.com/api/entry.baidu  
  2. String url="http://api.k780.com:88/?app=idcard.get";  
  3.         Map<String,String> map=new HashMap<>();  
  4.         map.put("appkey", "10003");  
  5.         map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");  
  6.         map.put("format", "json");  
  7.         map.put("idcard", "110101199001011114");  
  8.         XUtil.Get(url, map, new MyCallBack<PersonInfoBean>(){  
  9.   
  10.             @Override  
  11.             public void onSuccess(PersonInfoBean result) {  
  12.                 super.onSuccess(result);  
  13.                 Log.e("result", result.toString());  
  14.             }  
  15.   
  16.             @Override  
  17.             public void onError(Throwable ex, boolean isOnCallback) {  
  18.                 super.onError(ex, isOnCallback);  
  19.   
  20.   
  21.             }  
  22.   
  23.         });  

 

2.发送post请求

  1. String url="http://api.k780.com:88/?app=idcard.get";  
  2.         Map<String,Object> map=new HashMap<>();  
  3.         map.put("appkey", "10003");  
  4.         map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");  
  5.         map.put("format", "json");  
  6.         map.put("idcard", "110101199001011114");  
  7.         XUtil.Post(url, new MyCallBack<PersonInfoBean>(){  
  8.   
  9.             @Override  
  10.             public void onSuccess(PersonInfoBean result) {  
  11.                 super.onSuccess(result);  
  12.                 Log.e("result", result.toString());  
  13.             }  
  14.   
  15.             @Override  
  16.             public void onError(Throwable ex, boolean isOnCallback) {  
  17.                 super.onError(ex, isOnCallback);  
  18.   
  19.             }  
  20.         });  


3.上传文件

  1. /** 
  2.      * 上传文件(支持多文件上传) 
  3.      */  
  4.     private void uploadfile() {  
  5.         //图片上传地址  
  6.         String url="";  
  7.         Map<String,Object> map=new HashMap<>();  
  8.         //传入自己的相应参数  
  9.         //map.put(key, value);  
  10.         //map.put(key, value);  
  11.         XUtil.UpLoadFile(url, new MyCallBack<String>(){  
  12.   
  13.             @Override  
  14.             public void onSuccess(String result) {  
  15.                 super.onSuccess(result);  
  16.             }  
  17.   
  18.             @Override  
  19.             public void onError(Throwable ex, isOnCallback);  
  20.             }  
  21.   
  22.         });  
  23.   
  24.     }  


4.下载文件

  1. private void downloadfile() {  
  2.         //文件下载地址  
  3.         String url="";  
  4.         //文件保存在本地的路径  
  5.         String filepath="";  
  6.         XUtil.DownLoadFile(url, filepath,new MyCallBack<File>(){  
  7.             @Override  
  8.             public void onSuccess(File result) {  
  9.                 super.onSuccess(result);  
  10.   
  11.             }  
  12.   
  13.             @Override  
  14.             public void onError(Throwable ex, isOnCallback);  
  15.   
  16.             }  
  17.         });  


5.下载文件带进度条

  1. private void downloadprogressfile() {  
  2.         //文件下载地址  
  3.         String url="";  
  4.         //文件保存在本地的路径  
  5.         String filepath="";  
  6.         XUtil.DownLoadFile(url,new MyProgressCallBack<File>(){  
  7.   
  8.             @Override  
  9.             public void onSuccess(File result) {  
  10.                 super.onSuccess(result);  
  11.   
  12.             }  
  13.   
  14.             @Override  
  15.             public void onError(Throwable ex, isOnCallback);  
  16.   
  17.             }  
  18.             @Override  
  19.             public void onLoading(long total, long current,  
  20.                     boolean isDownloading) {  
  21.                 super.onLoading(total, current, isDownloading);  
  22.   
  23.             }  
  24.         });  
  25.     }  


6.发送get请求(服务器以xml格式返回)

  1. private void getxml() {  
  2.         String url="http://flash.weather.com.cn/wmaps/xml/china.xml";  
  3.         XUtil.Get(url, null, new MyCallBack<String>(){  
  4.   
  5.             @Override  
  6.             public void onSuccess(String xmlString) {  
  7.                 super.onSuccess(xmlString);  
  8.                 try{  
  9.                     XmlPullParserFactory factory = XmlPullParserFactory.newInstance();    
  10.                     XmlPullParser xmlPullParser = factory.newPullParser();    
  11.                     xmlPullParser.setInput(new StringReader(xmlString));    
  12.                     int eventType = xmlPullParser.getEventType();    
  13.                     while (eventType != XmlPullParser.END_DOCUMENT) {    
  14.                         switch (eventType) {    
  15.                         case XmlPullParser.START_TAG:    
  16.                             String nodeName = xmlPullParser.getName();    
  17.                             if ("city".equals(nodeName)) {    
  18.                                 String pName = xmlPullParser.getAttributeValue(0);    
  19.                                 Log.e("TAG", "city is " + pName);    
  20.                             }    
  21.                             break;    
  22.                         }    
  23.                         eventType = xmlPullParser.next();    
  24.                     }    
  25.                 }catch(Exception e){  
  26.                     e.printStackTrace();  
  27.                 }  
  28.             }  
  29.   
  30.             @Override  
  31.             public void onError(Throwable ex, isOnCallback);  
  32.             }  
  33.   
  34.         });  
  35.     }  

 

图片加载模块

用法:

  1. x.image().bind(imageView, url, imageOptions);  
  2. x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);  
  3. x.image().bind(imageView, "assets://test.gif", imageOptions);  
  4. x.image().bind(imageView, imageOptions, new Callback.CommonCallback<Drawable>() {...});  
  5. x.image().loadDrawable(url, new Callback.CommonCallback<Drawable>() {...});  
  6. x.image().loadFile(url, new Callback.CommonCallback<File>() {...});  


Xutils3的api还是比较简单的,相信大家都可以看懂,第一个参数传入一个View,第二个参数传入一个图片的网络地址,第三个参数一般是加载图片的配置。
下面看一下ImageOptions这个类吧:

  1. ImageOptions options=new ImageOptions.Builder()  
  2. //设置加载过程中的图片  
  3. .setLoadingDrawableId(R.drawable.ic_launcher)  
  4. //设置加载失败后的图片  
  5. .setFailureDrawableId(R.drawable.ic_launcher)  
  6. //设置使用缓存  
  7. .setUseMemCache(true)  
  8. //设置显示圆形图片  
  9. .setCircular(true)  
  10. //设置支持gif  
  11. .setIgnoreGif(false)  
  12. .build();  

 

其余的一些配置请参考源码

如果需要对加载的图片进行操作的话,可以使用:

x.image().loadDrawable(url,imageOptions,new Callback.CommonCallback<Drawable>() {...});

 

通过返回的Drawable对象进行图片的处理,满足项目的个性化的要求.

说了这么多,我想大家至少会对XUtils3有了一个基本的了解,由于XUtils3的数据库的用法比较多,本篇文章不会去涉及,下一篇文章我会为大家详细讲解XUtils3的数据库模块。大家赶紧现在动手操作一下吧!本文涉及到的所有实例都会在下面的demo中有涉及到,请自行参考。

源码下载地址:http://download.csdn.net/detail/a1002450926/9364413

原文地址:https://www.cnblogs.com/xiadongqing

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


AdvserView.java package com.earen.viewflipper; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory;
ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY。 |值|说明| |:--:|:--| |center|保持原图的大小,显示在ImageVie
文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win10/Android studio 3.21.环境配置 在SDK Tools里选择 CMAKE/LLDB/NDK点击OK 安装这些插件. 2.创建CMakeLists.txt文件 在Project 目录下,右键app,点击新建File文件,命名为CMakeLists.txt点击OK,创建完毕! 3.配置文件 在CMa..._link c++ project with gradle
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由mainActivity界面跳转到otherActivity界面1.写好两个layout文件,activity_main.xml和otherxml.xmlactivity_main.xml&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;RelativeLayout ="http://schemas..._android studio 界面跳转
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件来用,然后发现了这两款神作,都是外国的软件,而且都是开源的软件,因此把源码下载了下来,给有需要研究代理这方面的童鞋看看。不得不说,国外的开源精神十分浓,大家相互使用当前基础的开源软件,然后组合成一个更大更强的大开源软件。好吧,废话不多说,下面简单介绍一下这两款开源项目。一、ProxyDroid:ProxyDroid功能比较强大,用到的技术也比较多,源码也_proxydroid
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项目时Gradle Build 窗口却显示错误:程序包R不存在通常情况下是不会出现这个错误的。我是怎么遇到这个错误的呢?第一次创建项目,company Domain我使用的是:aven.com,但是创建过程在卡在了Building 'Calculator' Gradle Project info这个过程中,于是我选择了“Cancel”第二次创建项目,我还是使用相同的项目名称和项目路_r不存在
文章浏览阅读8.9w次,点赞4次,收藏43次。前言:在Android上使用系统自带的代理,限制灰常大,仅支持系统自带的浏览器。这样像QQ、飞信、微博等这些单独的App都不能使用系统的代理。如何让所有软件都能正常代理呢?ProxyDroid这个软件能帮你解决!使用方法及步骤如下:一、推荐从Google Play下载ProxyDroid,目前最新版本是v2.6.6。二、对ProxyDroid进行配置(基本配置:) (1) Auto S_proxydroid使用教程
文章浏览阅读1.1w次,点赞4次,收藏17次。Android Studio提供了一个很实用的工具Android设备监视器(Android device monitor),该监视器中最常用的一个工具就是DDMS(Dalvik Debug Monitor Service),是 Android 开发环境中的Dalvik虚拟机调试监控服务。可以进行的操作有:为测试设备截屏,查看特定进程中正在运行的线程以及堆栈信息、Logcat、广播状态信息、模拟电话_安卓摄像头调试工具
文章浏览阅读2.1k次。初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引擎可供使用,一边自暴自弃的抱怨Android平台游戏开发难度太高,又连个像样的游 戏引擎也没有,甚至误以为使用Java语言开发游戏是一件费力不讨好且没有出路的事情。事实上,这种想法完全是没有必_有素材的游戏引擎
文章浏览阅读3.2k次,点赞2次,收藏2次。2014年12月从csdn专家福利获得的一本书《Android游戏开发技术实战详解》,尘封了一年多的时间,今天才翻开来看。我认识中的Android,提到Android最先浮现在我脑海中的是那可爱的机器人图标:这个Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号(真的是灵感无处不在),于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根_智能手机的特点有哪些?
文章浏览阅读8.1k次,点赞9次,收藏11次。首先,Android是不是真的找工作越来越难呢?这个可能是大家最关心的。这个受大的经济环境以及行业发展前景的影响,同时也和个人因素有关。2016-08-26近期一方面是所在的公司招聘Java开发人员很难招到合适的,投简历的人很少;而另一方面,经常听身边的人说Android、iOS方面找工作不好找,特别是没什么经验的,经验比较少的!说是不好找,但在我家所在的吉林省省会长春,会Unity3D+Maya_android 开发和asp.net哪个好 site:blog.csdn.net
文章浏览阅读6.1k次。在上篇“走进Android开发的世界,HelloWorld”,我们创建了一个Android 项目 HelloWorld,并演示了如何通过USB连接手机查看运行效果;而如果没有手机或没有对应型号的手机,又想做对应型号(屏幕尺寸、Android系统版本)的适配,应该怎么办呢?这时Android模拟器就派上用场了。Android模拟器Android SDK自带一个移动模拟器。它是一个可以运行在你电脑上的_安卓移动开发软件怎样预览
文章浏览阅读8.9k次。Google IO 2017 上宣布,将Kotlin语言作为安卓开发的官方语言。Kotlin由JetBrains公司开发,与Java 100%互通,并具备诸多Java尚不支持的新特性。谷歌称还将与JetBrains公司合作,为Kotlin设立一个非盈利基金会。Kotlin 是一个基于 JVM 的静态类型编程语言,Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JV_kotlin为什么被嫌弃
文章浏览阅读9.6w次,点赞17次,收藏35次。有些情况下,不方便使用断点的方式来调试,而是希望在控制台打印输出日志,使用过Eclipse的同学都知道Java可以使用 System.out.println(""); 来在控制台打印输出日志,但是在android studio中却是不行的,还是有差别的,那应该用什么呢?android.util.Log在调试代码的时候我们需要查看调试信息,那我们就需要用Android Log类。android.ut_andirod.studio 为什么不在控制台打印输出
文章浏览阅读8.2k次,点赞2次,收藏8次。在上篇“走进Android开发的世界,HelloWorld”,我们创建了一个Android 项目 HelloWorld,并演示了如何通过USB连接手机查看运行效果;这里讲一下如何为应用添加一个按钮,并为按钮添加Click单击事件处理程序,显示/隐藏另一个按钮。添加按钮在HelloWorld项目的基础上,打开界面布局文件:activity_main.xml切换到Design(设计)模式;在组件But_activity_main.xml按钮隐藏
文章浏览阅读2.9k次,点赞3次,收藏9次。android 开发工具主流的还是Android Studio,当然也有很多人喜欢用Eclipse,也有人喜欢用IntelliJ IDEA ;还有Xamarin这种只需要编写一次代码,可以编译多种平台可运行的强大工具。但是它又真的强大吗?就我看来没有,身边很多人还是在用Android Studio、XCode开发应用,没见谁在用Xamarin之类的工具。系统要求WindowsMicrosoft®_android开发下载安装
文章浏览阅读4.2k次,点赞7次,收藏26次。你知道Hello World程序的由来吗?对于大多数编程语言的学习来说,真正入门的一课就是 Hello World!会而不难,难而不会。虽然很多人写过关于Android开发Hello World的文章,但随着时间的推移,开发工具、技术的进步,可能有些已经过时了。我就记录一下当下我所经历的第一个Android APP HelloWorld。一、准备1、开发环境参考:Android Studio 下载_android helloworld textview 句柄获取
这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android...