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

问题

在有赞实习,他们的代码中使用了很多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

https://github.com/pgyCode/CopyButterKnife
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,484评论 2 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,724评论 25 709
  • 俗话说的好“不想偷懒的程序员,不是好程序员”,我们在日常开发android的过程中,在前端activity或者fr...
    蛋西阅读 10,383评论 0 14
  • 雅思阅读不怎么容易,它的内容大多是学术性题材;生僻词汇也较多;且句式主干没那么容易一眼看穿,但却很经典。如果只是简...
    z张文阅读 3,709评论 0 0
  • 今日感受129:犹豫了很久,想了很久,我该怎么做?怎么去帮助孩子成长?或者说如何帮助自己进步? 今天早上,...
    亮亮苏阅读 1,865评论 0 3