前面四篇是自己参考有关知识和分析ButterKnife源码后写的,如果有不对的地方,还望指导下。
这一篇是实践篇。我们的目的是学会原理来变为自己的知识。
这个demo所使用的原理就是ButterKnife的原理
支持的注解
实现BindView,OnClick(多id),BindLayout
BindLayout注解为:
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface BindLayout {
int value();
}
- BindView实现对成员变量控件的注解
- OnClick实现对方法控件的注解
- BindLayout实现对activity的布局的注解,你可以自行扩展,demo只支持activity
使用后为
@BindLayout(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@BindView(R.id.tv)
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
ViewInjector.inject(this);
mTextView.setText("11111111");
}
@OnClick({R.id.id_btn0, R.id.id_btn1})
public void ok() {
Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show();
}
@OnClick(R.id.id_btn2)
public void goList() {
startActivity(new Intent(this, MainActivityList.class));
}
}
最后生成的的代码为:
public class MainActivity$$Injector implements Injector<MainActivity> {
@Override
public void inject(final MainActivity host, Object source, Finder finder) {
host.setContentView(2130968602);
host.mTextView= (TextView)(finder.findView(source,2131427412));
View.OnClickListener listener;
listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
host.ok();
}
} ;
finder.findView(source, 2131427413).setOnClickListener(listener);
finder.findView(source, 2131427414).setOnClickListener(listener);
listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
host.goList();
}
} ;
finder.findView(source, 2131427415).setOnClickListener(listener);
}
}
效果图为
尾声
如果你仔细阅读了上面的4篇文章,知道了原理,对于理解这个demo应该不难。
最后附上下载地址:
https://github.com/ta893115871/BindView