AndroidAnnnotations注入框架使用之Injection标签详解(十)

 

 

(一).前言:

前面我们已经对于AndroidAnnotations框架的注入组件的方式做了讲解,今天我们开始具体学习一下Injection标签使用。

 

本博客已完成Injection更新如下:

AndroidAnnnotations注入框架使用之Injection标签详解(十)

(二).@AfterExtras

自AndroidAnnotations3.1起

如果你需要在extras注入之后执行相关代码,[email protected]

 

@EActivity
public class MyClass{
 
  @Extra
  String someExtra;
 
  @Extra
  int anotherExtra;
 
 
  @AfterExtras
  public void doSomethingAfterExtrasInjection(){
    // someExtra and anotherExtra are set tothe value contained in the incoming intent
    // if an intent does not contain one of theextra values the field remains unchanged
  }
 
}

 

(三).@AfterInject

如下的例子:[email protected],它的属性还没有被注入,如果你需要在编译的时候,依赖注入的之后执行相关的代码。你可以在需要执[email protected]

 

@EBean
public class MyClass{
 
  @SystemService
  NotificationManager notificationManager;
 
  @Bean
  MyOtherClass dependency;
 
  public MyClass() {
    // notificationManager and dependency arenull
  }
 
  @AfterInject
  public void doSomethingAfterInjection() {
    // notificationManager and dependency areset
  }
 
}
(四).@AfterViews

 

[email protected]被调用。

[注]当onCreate()方法被调用的时候,[email protected][email protected]

实例如下:

 

@EActivity(R.layout.main)
public classMyActivity extends Activity {
 
    @ViewById
    TextView myTextView;
 
    @AfterViews
    void updateTextWithDate() {
        myTextView.setText(Date:  +new Date());
    }
[...]
[email protected]住,在onCreate()方法不要使用任务View相关的属性。

 

 

@EActivity(R.layout.main)
public classMyActivity extends Activity {
 
    @ViewById
    TextView myTextView;
 
    @Override
    public void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        // DON'T DO THIS !! It will throw aNullPointerException, myTextView is not set yet.
        // myTextView.setText(Date: + new Date());
    }
[...]
(五).@App

 

自AndroidAnnotations 2.1开始

[email protected]

 

@EActivity
public classMyActivity extends Activity {
  @App
  MyApplication application;
}
该同样在任何类型注入组件中进行使用,例如:@EBBean

 

 

@EBean
public class MyBean{
  @App
  MyApplication application;
}
(六).@Bean

 

在另一个注解类或者Android组件中使用这个注解类,[email protected];

 

@EBean
public classMyOtherClass {
  @Bean
  MyClass myClass;
}
同时你可以实现继承依赖关系

 

 

@EActivity
public classMyActivity extends Activity {
  @Bean
  MyOtherClass myOtherClass;
}
[email protected],你总会得到一个新的实例,除非那个类是一个单例。

 

值得我们注意的是,注解生成的子类是final类型的,也就是说我们不能在继承生成的类。但是我们可以扩展原始的类。扩展出来的类同样可以使用注解。如下:

 

@EActivity
public classMyChildActivity extends MyActivity {
}
(七).@Extra

 

自AndroidAnnotations1.0起

@Extra注解表示Activity中的属性应该注解成Intent中相应的Extra数据,由此用来打开Activity

使用实例如下:

 

@EActivity
public classMyActivity extends Activity {
 
  @Extra(myStringExtra)
  String myMessage;
 
  @Extra(myDateExtra)
  Date myDateExtraWithDefaultValue = newDate();
 
}
自AndroidAnnotations2.6起

 

[email protected],那么将会直接使用属性的名字。

 

@EActivity
public classMyActivity extends Activity {
 
  // The name of the extra will bemyMessage
  @Extra
  String myMessage;
}
你可以通过Intent构建起来传递额外的数据值

 

 

MyActivity_.intent().myMessage(hello).start();
(八).@FragmentArg

 

[email protected] Argument

生成的构建器的set方法总会使用argument相同的名字。默认情况下绑定值的key的名字就是该注入的属性的名字,[email protected]

实例:

 

@EFragment
public classMyFragment extends Fragment {
 
  @FragmentArg(myStringArgument)
  String myMessage;
 
  @FragmentArg
  String anotherStringArgument;
 
  @FragmentArg(myDateExtra)
  Date myDateArgumentWithDefaultValue = newDate();
 
}
使用Fragment构建器来进行使用。

 

 

MyFragmentmyFragment = MyFragment_.builder()
  .myMessage(Hello)
  .anotherStringArgument(World)
  .build();
(九).@[email protected]

 

[email protected],@EFragment,@Eview,@EViewGroup,@EBean,[email protected]@FragmentByTag来进行注入fragments。

[email protected]@FragmentByTag,因为后者没有编译时候的验证。

[email protected]@[email protected]它们只能存在于Activity中

 

@EActivity(R.layout.fragments)
public classMyFragmentActivity extends FragmentActivity {
  @FragmentById
  MyFragment myFragment;
 
  @FragmentById(R.id.myFragment)
  MyFragment myFragment2;
 
  @FragmentByTag
  MyFragment myFragmentTag;
 
  @FragmentByTag(myFragmentTag)
  MyFragment myFragmentTag2;
}
(十).@FromHtml

 

10.1.注入HTML

自AndroidAnnotations2.2起

如果你要TextView中注入HTML文本(可能因为格式问题或者你天生喜欢使用HTML),有下面两种方式帮到你:

  • @FromHtml
  • @HtmlRes

    现在我们假设有以下的字符串资源

     

     
    
        World!]]>
    
    10.2.@HtmlRes

     

    [email protected](获取字符串资源),然后进行包装进行调用HTML.fromHtml():

     

    @EActivity
    public classMyActivity extends Activity {
     
      // Injects R.string.hello_html
      @HtmlRes(R.string.hello_html)
      Spanned myHelloString;
     
      // Also injects R.string.hello_html
      @HtmlRes
      CharSequence helloHtml;
     
    }
    10.3.@FromHtml

     

    [email protected][email protected],该注解的目的就是设置HTML文本在TextView上面

     

    @EActivity
    public classMyActivity extends Activity {
     
      @ViewById(R.id.my_text_view)
      @FromHtml(R.string.hello_html)
      TextView textView;
     
      // Injects R.string.hello_html into theR.id.hello_html view
      @ViewById
      @FromHtml
      TextView helloHtml;
     
    }
    (十一).@HttpsClient

     

    自AndroidAnnotations2.6起

    11.1.简要介绍

    [email protected],[email protected]

    11.2.双向认证

    下面实例是一个完整的表单,如果你想实现验证,方式如下:

     

    @HttpsClient(trustStore=R.raw.cacerts,
        trustStorePwd=changeit,
        keyStore=R.raw.client,
        keyStorePwd=secret,
        allowAllHostnames=false)
    HttpClienthttpsClient;

     

    • trustStore:信任库
    • trustStorePwd:密码
    • keyStore:秘钥
    • keyStorePwd:秘钥密码
    • allowAllHostnames:允许的主机名

      简单的SSL身份认证如下:

       

      @HttpsClient(trustStore=R.raw.mycacerts,
          trustStorePwd=changeit)
      HttpClienthttpsClient;
      11.3.默认情况

       

      如果你没有指定信任的文件,注解会使用Android默认的信任库在/system/etc/security/cacerts.bks

       

      @HttpsClient
      HttpClienthttpsClient;
      11.4.使用实例

       

       

      @EActivity
      public classMyActivity extends Activity {
       
          @HttpsClient(trustStore=R.raw.cacerts,
              trustStorePwd=changeit,
              hostnameVerif=true)
          HttpClient httpsClient;
       
          @AfterInject
          @Background
          public void securedRequest() {
              try {
                  HttpGet httpget = newHttpGet(https://www.verisign.com/);
                  HttpResponse response =httpsClient.execute(httpget);
                  doSomethingWithResponse(response);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
       
          @UiThread
          public voiddoSomethingWithResponse(HttpResponse resp) {
              Toast.makeText(this, HTTP status + resp.getStatusLine().getStatusCode(), Toast.LENGTH_LONG).show();
          }
      }
      (十二).@NoConfigurationInstance

       

      自AndroidAnnotations2.5开始

      12.1.简要介绍

      当Configuration发生改变的时候,Activity通常会被销毁然后重新创建。这样会重新加载资源。这样就涉及一个从就对象到新Activity实例的引用问题(例如:加载图片,网络连接,Activity运行的线程…)

      这就是Activity.onRetainNonConfigurationInstance()用来解决这个问题。

      12.2.@NonConfigurationInstance

      [email protected]进行注解,在配置信息发生改变的时候来保存实例。

       

      @EActivity
      public classMyActivity extends Activity {
       
        @NonConfigurationInstance
        Bitmap someBitmap;
       
        @NonConfigurationInstance
        @Bean
        MyBackgroundTask myBackgroundTask;
       
      }
      (十三).@RootContext

       

      [email protected]@RootContext注入Android根组件,不过需要主要的时候只能注入上下文相关类型的。

       

      @EBean
      public class MyClass{
       
        @RootContext
        Context context;
       
        // Only injected if the root context is anactivity
        @RootContext
        Activity activity;
       
        // Only injected if the root context is aservice
        @RootContext
        Service service;
       
        // Only injected if the root context is aninstance of MyActivity
        @RootContext
        MyActivity myActivity;
       
      }
      (十四).@SystemService

       

      自AndroidAnnotations1.0起

      14.1.Android系统标准服务注入

      使用标准的系统服务,我们需要记得系统服务的常量名字,然后进行强制转换获取。

       

      notificationManager= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
      14.2.@SystemService

       

      [email protected]ndroid系统服务,该等同于调用Context.getSystemService()方法。

       

      @EActivity
      public classMyActivity extends Activity {
       
        @SystemService
        NotificationManager notificationManager;
       
      }
      (十五).@ViewById

       

      [email protected]中的View组件。等同于调用findViewById()方法。该View的id可以设置在注解的参数中,[email protected](R.id.myTextView)。如果没有设置,将会使用字段的的名字。并且字段不能为私有的。实例如下:

       

      @EActivity
      public classMyActivity extends Activity {
       
        // Injects R.id.myEditText
        @ViewById
        EditText myEditText;
       
        @ViewById(R.id.myTextView)
        TextView textView;
      }
      (十六).@ViewsById

       

      自AndroidAnnotations3.1起

      [email protected][email protected][email protected][email protected][email protected]

       

      到此位置关于AndroidAnnotations注解Injection标签使用方法已经全部讲解完成了。

       

更多相关文章
  • 我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然后深入学习了Membership的架构设计.正所谓从实践从来,到实践从去,在我们把Membership的结构吃透之后,我们要完善它,改造它,这样我们才能真正学以致用.今天我们将以用户信息为主线,从SqlMembershipP ...
  • 内存中OLTP是关于内存中的一切.但那只是对了一半.在今天的文章里我想给你展示下,当你从内存读取数据时,即使内存中OLTP也会引起磁盘活动.这里的问题是执行计划里,不正确的统计信息与排序(sort)运算符的组合. 排序(sort)运算符问题 我们都知道,排序(sort)运算符需要所谓的内存授予(Me ...
  • 链接在这
  • Discard Old Builds:hudson默认保留过去的构建,勾选此选项,则可以设置构建记录的有效期:(帮助:这里控制着您想要在hudson所在的磁盘把构建记录存储的有效期:Hudson为此提供两个标准:1.时间驱动-在hudson中您可以判断如果达到一定时限来删除一条记录(例如7天前):2 ...
  • 第五讲 Visual Odometry (视觉里程计) 读者朋友们大家好,又到了我们开讲rgbd slam的时间了.由于前几天博主在忙开会拍婚纱照等一系列乱七八糟的事情,这一讲稍微做的慢了些,先向读者们道个歉! 上几讲中,我们详细讲了两张图像间的匹配与运动估计.然而一个实际的机器人总不可能只有两个图 ...
  • 上一篇:http://www.2cto.com/Article/201212/174596.html 一:Dedecms变量覆盖新型绕过:  请看看文件:include/filter.inc.php  引用一哥话语:  这是2B的dede再次变量覆盖漏洞根源..  这是过滤或替换非法关键字.正常的. ...
一周排行
  • <sqlMapGenerator> 元素 <sqlMapGenerator> element 用于定义SQL映射生成器的属性. SQL映射生成器为每一个内省的表生成MyBatis/iBATIS ...
  • Neeaos Blog 最近项目中要用到一个正则表达式,排除某个字符串,我们知道排除单个字符串的话,可以用[^abc],这样就可以排除a或者b或者c了,但是要排除abc呢?      网上找了下,都不太好用,自己写了 ...
  • A.创建证书: (1)将创建证书工具makecert.exe放到任意地方.可以把该文档中的makecert.exe工具粘贴到任意目录. (2)doc命令去到makecert.exe的路径,然后输入命令makecert ...
  • HTC手机怎么进入和解除安全模式?相信很多人都会碰到的吧,今天小编就为大家介绍HTC手机进入和解除安全模式方法,希望对大家有所帮助 HTC手机怎么进入和解除安全模式?相信很多人都会碰到的吧,今天小编就为大家介绍HTC ...
  • 1.文本框显示默认文字: <textarea>白鸽男孩</textarea> <textarea>白鸽男孩</textarea> 2.鼠标点击文本框,默认文字消失: & ...
  • SSH安装容易.使用简单,而且比较常见,一般的Unix系统.Linux系统.FreeBSD系统都附带有支持SSH的应用程序包.ubuntu是以桌面应用为主的linux操作系统,而Ubuntu系统必须开启ssh服务后, ...
  •   在iOS开发中,定时器NSTimer并不能够准确的出发,通常使用NSTimer只能控制不需要精确处理的操作,而CADisplayLink就是在每次屏幕刷新时,通知系统.CADisplayLink最大的好处就是可以 ...
  • 昨晚上在做数据库的导出导入操作的时候,发现在将导出数据导入到新库过程中报告如下错误: 在查看数据库中关于外部表的视图中相关信息: select * from dba_directories Select * from ...
  •   bcp实用工具 一种命令提示符大容量实用工具,它以用户指定的格式从操作系统文件或向操作系统文件 SQL Server 数据.
  • 统计某文件夹下文件的个数 ls -l |grep "^-"|wc -l 统计某文件夹下目录的个数 ls -l |grep "^d"|wc -l 统计文件夹下文件的个数,包括子文 ...