为了账号安全,请及时绑定邮箱和手机立即绑定

Android----模仿ButterKnife的简单实践

标签:
Android

问题

在有赞实习,他们的代码中使用了很多butterknife的相关操作,于是实践一下,简单实现自己想象中的绑定与点击

思路

BindView简化findViewById(R.id.xxx)
BindClick简化setOnClickListener(this);

0.绑定时两个参数:Object host, View view。
1.遍历宿主中的全部Field,为设置了BindView注解的添加findViewById
2.查看宿主的BindClick,如果有,为BindClick中的变量设置setOnClickListener

效果

https://img1.sycdn.imooc.com//5d2c7c6f0001fe6104600533.jpg

image.png

文件结构

https://img1.sycdn.imooc.com//5d2c7c73000176a906030314.jpg

image.png

使用代码

MainActivity.java
@BindClick(ids =  {
        R.id.btnOne,
        R.id.btnTwo,
        R.id.btnThree
})public class MainActivity extends AppCompatActivity implements View.OnClickListener{    @BindView(id = R.id.txt)    public TextView txt;    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        CopyButterKnife.bind(this, getWindow().getDecorView());

        init();
    }    private void init() {
        txt.setText("hello copybutterknife");
        getSupportFragmentManager().beginTransaction().add(R.id.container, new MainFragment()).commit();
    }    public void onClick(View view){        int id = view.getId();        if (id == R.id.btnOne){
            txt.setText("activity buttonOne Click");
        } if (id == R.id.btnTwo){
            txt.setText("activity buttonTwo Click");
        } if (id == R.id.btnThree){
            txt.setText("hello copybutterknife");
        }
    }
}
MainFragment.java
@BindClick(ids = {
        R.id.btnOne,
        R.id.btnTwo,
        R.id.btnThree
})public class MainFragment extends Fragment implements View.OnClickListener {    private View root;    @BindView(id = R.id.txt)    public TextView txt;    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        root = inflater.inflate(R.layout.fragment_main, null);
        CopyButterKnife.bind(this, root);

        init();        return root;
    }    private void init(){
        txt.setText("hello world");
    }    @Override
    public void onClick(View v) {        int id = v.getId();        if (id == R.id.btnOne){
            txt.setText("fragment one click");
        } else if (id == R.id.btnTwo){
            txt.setText("fragment two click");
        } else if (id == R.id.btnThree){
            txt.setText("hello world");
        }
    }
}

工具代码

BindClick.java
@Retention(RetentionPolicy.RUNTIME)
public @interface BindClick {    int[] ids();
}
BindView.java
@Retention(RetentionPolicy.RUNTIME)public @interface BindView {    int id();
}
CopyButterKnife.java
public class CopyButterKnife {        public static void bind(Object host, View view) {
        Field[] fields = host.getClass().getFields();        for (Field field : fields) {
            BindView bindView = field.getAnnotation(BindView.class);            if (bindView != null) {                try {
                    field.set(host, view.findViewById(bindView.id()));
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }

        BindClick bindClick = host.getClass().getAnnotation(BndClick.class);        if (bindClick != null) {            int[] ids = bindClick.ids();            for (int id : ids) {
                view.findViewById(id).setOnClickListener((View.OnClickListener) host);
            }
        }
    }
}



作者:pgydbh
链接:https://www.jianshu.com/p/8a25cdd734bc


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消