Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何缩短类似按钮的findViewById和setOnClickListener?_Java_Android - Fatal编程技术网

Java 如何缩短类似按钮的findViewById和setOnClickListener?

Java 如何缩短类似按钮的findViewById和setOnClickListener?,java,android,Java,Android,如果你有很多类似用途的按钮,有没有办法缩短代码? 一定有办法,但是我还没有足够的经验来想出一个不同的解决方案。 以以下代码为例: 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

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

    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]);
}
private Button[]btns=新建按钮[4];
对于(int i=0;i<4;i++){
this.btns[i]=super.findviewbyd(新int[]{R.id.btn1,R.id.btn2,R.id.btn3,R.id.btn4}[i]);
}

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

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

View.OnClickListener createOnClickListener(字符串文本){
新建视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
view_input.setText(文本);
函数();
}
}
}
示例用法

btn_4.setOnClickListener(createOnClickListener(“4”))
考虑一下你是否特别厌倦了必须做的
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()
});
我们正在使用,所以我们可以写这个

@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;
         .....
         .....
      }
  }

如果避免findviewbyid()是您的最终目标,那么您可以使用视图绑定


查看此链接以查看绑定的官方文档。

Yep,我在写回答时也有同样的想法。虽然我喜欢这样的外观,但必须依靠第三方库来实现这一点对我来说并不太好,因为这可能只是一个你反复使用的数组