xUtils,butterknife...处理findviewbyid

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xUtils,butterknife...处理findviewbyid相关的知识,希望对你有一定的参考价值。

 

 

在写android中,经常要出现大量的findviewbyid

        et_path = (EditText) findViewById(R.id.et_path);
        tv_info = (TextView) findViewById(R.id.tv_info);

 

在这儿介绍一下用注解的办法处理。从此告别findviewbyid。(偶尔)

**xUtils 3**
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {

    @ViewInject(R.id.aaa)
    private TextView aaa;
    @ViewInject(R.id.bbb)
    private TextView bbb;
    @ViewInject(R.id.ccc)
    private TextView ccc;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        x.view().inject(this);//一定不要忘记这句话。
    }

   // @Event(value = R.id.mybut,type = View.OnClickListener.class)
    @Event({R.id.buttonOn1,R.id.buttonOn2})
    private void button(View view) {
        if (view.getId() == R.id.buttonOn1) {
            aaa.setText("sss");
            bbb.setText("www");
            ccc.setText("eee");
        }else if(view.getId() == R.id.buttonOn2){
            bbb.setText("2222222");
        }
    }


----------


    <TextView
        android:id="@+id/aaa"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="aaaaa" />

    <TextView
        android:id="@+id/bbb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="bbbbb" />

    <TextView
        android:id="@+id/ccc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ccccc!" />

    <Button
        android:id="@+id/buttonOn1"

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button1" />

    <Button
        android:id="@+id/buttonOn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button2" />

 

如果你使用的是 uXtils 2 :

    @ViewInject(R.id.et_path)
    private EditText et_path;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //这句话一定不能少,这句话相当与上面的那句。效果一样
        ViewUtils.inject(this); 
        }


@ViewInject(R.id.textView)
TextView textView;

//@ViewInject(vale=R.id.textView, parentId=R.id.parentView)
//TextView textView;

@ResInject(id = R.string.label, type = ResType.String)
private String label;

// 取消了之前使用方法名绑定事件的方式,使用id绑定不受混淆影响
// 支持绑定多个id @OnClick({R.id.id1, R.id.id2, R.id.id3})
// or @OnClick(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})
// 更多事件支持参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
@OnClick(R.id.test_button)
public void testButtonClick(View v) { // 方法签名必须和接口中的要求一致
    ...
}

3,如果你使用的是butterknife,这和上面的有点点不同。
 @InjectView(R.id.ok_btn) //控件对应的ID
 2     Button mBtn;
 3 
 4     @InjectView(R.id.title_text)
 5     TextView mTitleTextView;
 6 
 7     @Override
 8     protected void onCreate(Bundle savedInstanceState) {
 9         super.onCreate(savedInstanceState);
10         setContentView(R.layout.main_activity);
11 
12         ButterKnife.inject(this);
13 
14         //这样之后就可以直接使用变量了
15         mTitleTextView.setText("test");
16 
17     }


@InjectViews({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<EditText> nameViews;


@OnClick(R.id.submit)
 public void submit() {
   // TODO submit data to server...
 }
 //还可以批量为多个控件添加为同一个响应函数:
@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
  public void pickDoor(DoorView door) {
   if (door.hasPrizeBehind()) {
       //todo
   } else {
     //todo
   }
  }




注:最新版的库已经将方法名改了,当然也是兼容上面所列的例子的。最新示例如下:
class ExampleActivity extends Activity {
  @FindView(R.id.user) EditText username;
  @FindView(R.id.pass) EditText password;

  @OnClick(R.id.submit) void submit() {
    // TODO call server...
  }

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
  }
}

用gradle配置的时候加入: 
compile files(‘libs/butterknife-7.0.1.jar’),自己下载或者github导入包重点


public class MainActivity extends Activity {

    @Bind(R.id.tv_text1)
    TextView tv_text1;

    @Bind(R.id.tv_text2)
    TextView tv_text2;

    @Bind(R.id.tv_text3)
    TextView tv_text3;

    @Bind(R.id.tv_text4)
    TextView tv_text4;

    @Bind(R.id.tv_text5)
    TextView tv_text5;

    @Bind(R.id.tv_text6)
    TextView tv_text6;

    @Bind(R.id.tv_text7)
    TextView tv_text7;

    @Bind(R.id.tv_text8)
    TextView tv_text8;

    @BindString(R.string.hello_world) // 设置sting
    String title;

    @BindDrawable(R.drawable.ic_launcher) // 设置资源
    Drawable graphic;

    @BindColor(R.color.color_bule) // 设置颜色
    int red;

    @BindDimen(R.dimen.text_size) // 设置dimen值
    float spacers;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.bind(MainActivity.this);//绑定。

        tv_text1.setText("1231");
        tv_text2.setText("1024");
        tv_text3.setText("5454");
        tv_text4.setText("7865");
        tv_text5.setText("9630");
        tv_text6.setText("wertw");

    }

    @OnClick(R.id.tv_text1)
    public void sayHi(TextView button) {
        button.setText("你按到我了啦!");
    }

    @SuppressLint("NewApi")
    @OnClick(R.id.tv_text2)
    public void sayHi2(TextView button) {
        button.setBackground(graphic);
    }

    @OnClick(R.id.tv_text3)
    public void sayHi3(TextView button) {
        button.setTextColor(red);
    }

    @OnClick(R.id.tv_text4)
    public void sayHi4(TextView button) {
        button.setTextSize(spacers);
    }

**4,如果你使用的是很早的版本,继承RoboActivity的 
,则:这个不要在onCreate里面写那几话。**

@InjectView(R.id.button)
    Button goButton;
    @InjectView(R.id.textview1)
    TextView textView1;
    @InjectView(R.id.textview2)
    TextView textView2;
    @InjectView(R.id.textview3)
    TextView textView3;
    @InjectView(R.id.textview4)
    TextView textView4;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.injectview);
//      goButton.setOnClickListener(mGoListener);
        goButton.setOnClickListener(this);

    }




    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.button) {
            textView1.setText("Clicked");
            textView2.setText("Clicked");
            textView3.setText("Clicked");
            textView4.setText("Clicked");
        }
    }

 

 

以上是关于xUtils,butterknife...处理findviewbyid的主要内容,如果未能解决你的问题,请参考以下文章

ButterKnife编译时生成代码原理:butterknife-compiler源码分析

Android Studio 生成 Xutils3 注入的插件

自己简易打造的IOC注解框架:SteadyoungIOC

自己简易打造的IOC注解框架:SteadyoungIOC

手动实现bindview

ButterKnife -- 源码分析 -- 在‘编译期’间生成findViewById等代码