• Android开源框架:AndroidAnnotations


    AndroidAnnotations首页 

    github上的项目地址AndroidAnnotations Github

    wiki:https://github.com/excilys/androidannotations/wiki/AvailableAnnotations

    1、使用依赖注入(Dependency Injection)不熟悉的可以了解一下Inversion of Control(IoC)

    2、简化的线程模型(Simplified  threading model)  

    3、事件绑定(Event binding)

    4、REST Client

    5、No Magic  [它的意思是:AndroidAnnotations在编译的时候会产生一个子类(接下来你会明白),你查看这个子类,可以看到它是如何工作的]

    项目中重要的两个jar包分别是:androidannotations-api-3.0.1.jar和androidannotations-3.0.1.jar
    2).新建一个android项目,然后将androidannotations-api-3.0.1.jar复制到libs目录下,在项目的根目录新建一个文件夹,命名为compile-libs,然后将androidannotations-3.0.1.jar复制到该目录下.

    3).然后设置项目属性:右键->Properties->Java Compiler->Annotation Processing 在该页面选中Enable project specific settings。

    4).然后点击Annotation Processing的子项Factory Path页面,选中Enable project specific settings,然后添加编译所需的jar包。点击“Add JARs”将之前complie-libs目录下的androidannotations-3.0.1.jar导入,保存后退出。

    运用方式之布局文件xml:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:orientation="vertical"
     4     android:layout_width="fill_parent"
     5     android:layout_height="fill_parent"
     6     >
     7     <EditText  
     8         android:id="@+id/myInput"
     9         android:layout_width="fill_parent" 
    10         android:layout_height="wrap_content" 
    11         />
    12     <Button  
    13         android:id="@+id/myButton"
    14         android:layout_width="fill_parent" 
    15         android:layout_height="wrap_content" 
    16         android:text="Click me!"
    17         />
    18     <TextView  
    19         android:id="@+id/myTextView"
    20         android:layout_width="fill_parent" 
    21         android:layout_height="wrap_content" 
    22         />    
    23 </LinearLayout>

    对应Activity的java文件:

     1 package com.example.testaa;
     2 
     3 import org.androidannotations.annotations.AfterViews;
     4 import org.androidannotations.annotations.Click;
     5 import org.androidannotations.annotations.EActivity;
     6 import org.androidannotations.annotations.UiThread;
     7 import org.androidannotations.annotations.ViewById;
     8 
     9 import android.app.Activity;
    10 import android.content.Intent;
    11 import android.widget.Button;
    12 import android.widget.EditText;
    13 import android.widget.TextView;
    14 import android.widget.Toast;
    15 @EActivity(R.layout.activity_main)
    16 public class MainActivity extends Activity {
    17     @ViewById(R.id.myInput)
    18     EditText myEditText;
    19     
    20     @ViewById
    21     Button myButton;
    22     
    23     @ViewById
    24     TextView myTextView;
    25     /**
    26      * 加载完View之后进行的处理
    27      */
    28     @AfterViews
    29     void afterViewProcess(){
    30         myButton.setText("Next");
    31         myTextView.setText("第一个Activity页面");
    32     }
    33     
    34     /**
    35      * 绑定点击事件
    36      */
    37     @Click(R.id.myButton)
    38     void processClick(){
    39         Intent intent=new Intent(this,SubActivity_.class);
    40         intent.putExtra("input_value", myEditText.getEditableText().toString());
    41         startActivity(intent);
    42     }
    43     
    44     /**
    45      * 利用UI线程显示一个Toast
    46      * @param content
    47      */
    48     @UiThread
    49     void showToast(String content){
    50         Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();
    51     }
    52     /**
    53      * 延时显示
    54      * @param content
    55      */
    56     @UiThread(delay=1000)
    57     void showToastDelay(String content){
    58         Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();
    59     }
    60 }

    可以看出,我们通过注解的方式,大大简化了原有的代码。

    注解1:@ViewById 与findViewById功能相似,如果ViewById后没有设置资源ID的话,就是自动查找与变量名称相同的id资源(条件是控件变量名称要与xml中定义的id必须一致)。

    但是这样会有一个问题,如果在Click()方法中调用,运行时就会报出:NullPointerException的错误,我们就不能在Click()方法中直接使用,而是要在@AfterView注释的方法中使用

    注解2:@Click 点击事件处理的注解。

    对于@Click,方法名和xml文件中的id一样就可以这样写,AndroidAnnotations会自动识别,对于多个Button,可以写多个@Click,也可以在这样:

    @Click({R.id.button1,R.id.button2,R.id.button3})  
    void buttonClicked(Button bt){  
        //TODO ...
    }

    注解3:@UiThread 后台Ui线程的注解,省去了Handler等等。

    注解4:@EActivity 提示Activity的注解,注意,该注解将Activity编译成Activity_,注意,多一个下划线“_”,因此在AndroidManifest.xml文件中需要将其添加下滑线

    原因:使用AndroidAnnotations,编译的时候会生成一个子类,这个子类的名称就是在原来的类之后加了一个下划线“_”,比如这个例子产生的子类名称为“MyActivity_”,这就需要你在注册这个Activity的时候,在AndroidManifest.xml中将 MyActivity 改为 MyActivity_ ,使用的时候也是使用MyActivity_来表示此类,如从另一个Activity跳转到此节目就要这样用:

    注解5:@AfterViews 是指View类注入完毕之后执行的代码。

    我们第二个页面的布局文件与第一个相同,我们主要看一下它的java文件:

    package com.example.testaa;
    
    import org.androidannotations.annotations.AfterViews;
    import org.androidannotations.annotations.Click;
    import org.androidannotations.annotations.EActivity;
    import org.androidannotations.annotations.Extra;
    import org.androidannotations.annotations.UiThread;
    import org.androidannotations.annotations.ViewById;
    
    import android.app.Activity;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    
    @EActivity(R.layout.activity_sub)
    public class SubActivity extends Activity{
        @ViewById(R.id.myInput)
        EditText myEditText;
        
        @ViewById
        Button myButton;
        
        @ViewById
        TextView myTextView;
        
        @Extra(value="input_value")
        String inputString;
        
        @AfterViews
        void afterViewProcess(){
            myTextView.setText(inputString);
        }
        
        @Click(R.id.myButton)
        void processClick(){
            showToast("Clicked me !");
        }
        
        @UiThread
        void showToast(String content){
            Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();
        }
    }

    注:一个@Extra注解,这个注解的含义和getIntent().getExtra()相同,目的是获取上一个Activity通过Intent传递过来的值。

    AndroidManifest.xml文件:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.testaa"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6 
     7     <uses-sdk
     8         android:minSdkVersion="8"
     9         android:targetSdkVersion="17" />
    10 
    11     <application
    12         android:allowBackup="true"
    13         android:icon="@drawable/ic_launcher"
    14         android:label="@string/app_name"
    15         android:theme="@style/AppTheme" >
    16         <activity
    17             android:name="com.example.testaa.MainActivity_"
    18             android:label="@string/app_name" >
    19             <intent-filter>
    20                 <action android:name="android.intent.action.MAIN" />
    21 
    22                 <category android:name="android.intent.category.LAUNCHER" />
    23             </intent-filter>
    24         </activity>
    25         <activity
    26             android:name="com.example.testaa.SubActivity_"></activity>
    27     </application>
    28 
    29 </manifest>

    注意:Activity的声明,多添加了下划线“_”

  • 相关阅读:
    网络数据包分析工具列表
    完美支持Py3的微信开发库推荐
    微信后台服务器地址验证的逻辑
    人工智能头条技能树图谱汇集
    如何构建通用 api 中间层
    vue 2.0 购物车小球抛物线
    基于Vue的事件响应式进度条组件
    vuex学习总结
    vue 上传图片到阿里云(前端直传:不推荐)
    vue-router的history模式发布配置
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/4182530.html
Copyright © 2020-2023  润新知