XUtils框架的學習(一)


一  xutils框架引入到AndroidStudio工程,最簡單的方法:
① 在APP的build.gradle里面加入 compile 'org.xutils:xutils:3.3.36'。
② 一定要自定義一個application.class
在自定義的application里的onCreate方法里面初始化xutils:

x.Ext.init(this);//初始化XUtils
x.Ext.setDebug(BuildConfig.DEBUG);//是否輸出debug日志

③ 在manifest文件里面加入自己的application

 
<application
android:name=".application.GlobalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
 

④ 加入權限 
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

其他的方法比如引入jar包引入lib自行百度。

二 xutils框架的注解
注解框架很好用,直接在activity或者fragment里面加入
@ViewInject(R.id.xxx)
private TextView mTvText;
注意,注解的時候一定要在onCreate之前,像聲明屬性和變量一樣。然后偶就好奇注解框架是怎么完成了用viewInject去完成findViewById這個操作的。就順便了解了一下注解是怎么一回事。


  2.1 注解機制  其實就是java的反射實現的,我不在這里掉書袋解釋反射是啥,自行百度。下面就自己實現了一下用反射實現findViewById
  ① 新建一個@annotation類型的class ,如圖 ,

我們看到ViewInject的創建和接口差不多,但是別忘了前面的@和前面的聲明@Target和@Retention

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
int id () default -1;//控件ID,在某一個控件上面使用注解標注其ID
} 

然后就是反射類InjectView的創建。類里面只有一個方法injectView(Activity activity)

 
public class InjectView {
    public static void injectView(Activity activity) {
       try {
           Class clazz = activity.getClass();
           Field[] fields = clazz.getDeclaredFields();//得到傳入的activity的所有字段
           for(Field field:fields){
               if(field.isAnnotationPresent(ViewInject.class)){
                   ViewInject inject = field.getAnnotation(ViewInject.class);
                   int id  = inject.id();
                   if(id > 0 ){
                       field.setAccessible(true);
                       field.set(activity,activity.findViewById(id));
                   }

               }
           }
       }catch (IllegalAccessException e){
           e.printStackTrace();
       }catch (IllegalArgumentException e){
           e.printStackTrace();
       }

    }
}
 

然后再在我的activity中使用我自己定義的注解

 
public class MainActivity extends AppCompatActivity {

    @ViewInject(id = R.id.tv_text)
    private TextView mTvText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InjectView.injectView(this);
        mTvText.setText("ssssss");
    }
}
 

可以看到我先注解聲明我的TextView,完成注解聲明后再利用InjectView.injectView(this),來完成整個注解。類里面用到了一個Field的類,就又好奇這個是干啥的(好奇寶寶),在剛接觸java的時候書上看到過Field就是對象的屬性,當時覺得就這么回事吧,但素,后面學習的時候又見過幾回,那時候沒怎么去真正的去深入了解,只知道跟反射有點關系,在網絡編程和數據庫掛鈎的一些代碼編寫里面出現的頻率太大!!!當時正年少輕狂,什么都是只是淺嘗輒止。如今追悔莫及!!扼腕長嘆!!!不廢話了,接下來熟悉Field

  2.2 Field類的學習

  在查看了一些文檔並自己寫了一個測試類之后,才明白,Field說白了其實就是類的屬性,是啊說的很在理(書上說的是沒錯的所以不能說書糊弄了你我)。通過它可以得到一個類的所有屬性的類型,父類型以及屬性值等等。

下面就是我寫的那個測試類:首先寫一個Student的實體

 
package bean;

import java.util.Date;


public class Students {
    
    private String name ;
    private String address;
    private long id;
    private Date birthday;
    public String nickName;
    
    
    @Override
    public String toString() {
        return "Students [name=" + name + ", address=" + address + ", id=" + id
                + ", birthday=" + birthday + ", nickName=" + nickName + "]";
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    
    

}
 

然后就是針對這個實體進行Field的測試

 
package main;

import java.lang.reflect.Field;
import java.util.Date;

import bean.Students;

public class TestField {

    public static void main(String[] args) {
        Students student = new Students();
        student.setName("John");
        student.setNickName("pumpKing");
        student.setBirthday(new Date());
        student.setId(3501197405300359L);
        
        try {
            Field property1 = student.getClass().getDeclaredField("name");
            Field property2 = student.getClass().getField("nickName");
            Field property3 = student.getClass().getDeclaredField("birthday");
            System.err.println(property1);
            System.err.println(property2);
            System.err.println(property3);
            System.out.println("the superClass of Student is: "+student.getClass().getSuperclass());
            System.out.println("the superClass of String is: "+property1.getClass().getSuperclass());
            System.out.println("the superClass of Date is: "+property3.getClass().getSuperclass());
            System.out.println("the classLoader of student is: "+student.getClass().getClassLoader().getClass().getName());
            Field[] fields = student.getClass().getDeclaredFields();
            for(Field field : fields){
                field.setAccessible(true);
                System.out.println(field.get(student));
                System.out.println(field);
            }
            System.out.println("origin = "+student.toString());
            property2.set(student, "egg");//利用反射操作類的屬性
            System.out.println("then = "+student.toString());
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
 

下面是測試的結果

 
private java.lang.String bean.Students.name
public java.lang.String bean.Students.nickName
private java.util.Date bean.Students.birthday
the superClass of Student is: class java.lang.Object
the superClass of String is: class java.lang.reflect.AccessibleObject
the superClass of Date is: class java.lang.reflect.AccessibleObject
the classLoader of student is: sun.misc.Launcher$AppClassLoader
John
private java.lang.String bean.Students.name
null
private java.lang.String bean.Students.address
3501197405300359
private long bean.Students.id
Tue Jun 14 14:45:45 CST 2016
private java.util.Date bean.Students.birthday
pumpKing
public java.lang.String bean.Students.nickName
origin = Students [name=John, address=null, id=3501197405300359, birthday=Tue Jun 14 14:45:45 CST 2016, nickName=pumpKing]
then = Students [name=John, address=null, id=3501197405300359, birthday=Tue Jun 14 14:45:45 CST 2016, nickName=egg]
 

okay,XUTils的注解就說到這里,畢竟這並不是它的重頭戲。

標簽:  AndroidStudio, xutils, 框架


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM