Android—-模仿ButterKnife的简单实践

作者 : 开心源码 本文共2468个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共185人阅读

问题

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

思路

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

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

效果

image.png

文件结构

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);            }        }    }}

demo

pgyCode/CopyButterKnife

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android—-模仿ButterKnife的简单实践

发表回复