如何缩短类似按钮的findviewbyid和setonclicklistener?

t40tm48m  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(274)

如果你有很多类似用途的按钮,有没有办法缩短代码?一定有办法,但是我还没有足够的经验来想出一个不同的解决方案。以下面的代码为例:

btn_0 = findViewById(R.id.btn_0);
    btn_1 = findViewById(R.id.btn_1);
    btn_2 = findViewById(R.id.btn_2);
    btn_3 = findViewById(R.id.btn_3);
    btn_4 = findViewById(R.id.btn_4);
    btn_5 = findViewById(R.id.btn_5);

    btn_0.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view_input.setText("0");
            function();
        }
    });

    btn_1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view_input.setText("1");
            function();
        }
    });

    btn_2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view_input.setText("2");
            function();
        }
    });

    btn_3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view_input.setText("3");
            function();
        }
    });

    btn_4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view_input.setText("4");
            function();
        }
    });

    btn_5.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view_input.setText("5");
            function();
        }
    });

有什么方法可以更有效地编写这种代码,而且代码的重复性更少?我见过这样一个选项,但是我不知道它是如何工作的:

private Button[] btns = new Button[4];

for (int i = 0; i < 4; i++) {
    this.btns[i] = super.findViewById(new int[]{R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4}[i]);
}

如果你能想出一个解决办法,我真的很感激你能简短地解释一下为什么这种方法是有效的。感谢您的努力:)

6yt4nkrj

6yt4nkrj1#

如果您特别厌倦了不得不这样做,请考虑viewbinding findViewById :
在示例文档中,它允许您执行以下操作

private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}

binding.getName().setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});
bgibtngc

bgibtngc2#

我们正在使用https://jakewharton.github.io/butterknife/ 所以我们可以写这个

@OnClick({R.id.button0,R.id.button1,R.id.button2,R.id.button3,R.id.button4})
  public void setText(View view){
      switch(view.getId()){
         case R.id.button0:
             break;
         .....
         .....
      }
  }
uxhixvfz

uxhixvfz3#

如果最终目标是避免findviewbyid(),那么可以使用视图绑定。
https://developer.android.com/topic/libraries/view-binding
查看此链接查看绑定的官方文档。

u5i3ibmn

u5i3ibmn4#

如果您只是想避免dry原则(不要重复您自己),您可以在函数中创建侦听器并传递 text 参数如下:

View.OnClickListener createOnClickListener(String text) {
  new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view_input.setText(text);
            function();
        }
    }
}

示例用法

btn_4.setOnClickListener(createOnClickListener("4"))

相关问题