按钮setOnClickListeners的最佳实践

时间:2017-08-25 14:17:07

标签: java android

我对“活动”按钮操作中setOnClickListener的不同用法感到困惑。 我找到了各种解决方案,但我确信有一些最好/更差的方法来实现它,还有一些“因为”。

我理解(作为主题)这是最好的方法,哪些(以及为什么)不是。

  1. 在activity(class)中调用私有函数并设置监听器及其中的所有强制转换:

    public class MainActivity extends AppCompatActivity {
       Private Button myButton;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          OnClickButton();
       }
       private void OnClickButton(){
          myButton = (Button)findViewById(R.id.Button1);
          myButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                // button actions
             }
    
          });
       }
    }
    
  2. 在activity中设置setOnClickListener,然后调用相应的函数: (在这种情况下,我不明白为什么视图在onClick中定义为 final

    public class MainActivity extends AppCompatActivity {
       Private Button myButton;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          myButton.setOnClickListener(onClickListener);
       }
       private OnClickListener onClickListener = new OnClickListener() {
          @Override
          public void onClick(final View v) {
             // button actions
          }
       }
    
  3. 只是作为带有参数myView的函数,通过链接xml文件中的函数:
  4. ON MAINACTIVITY.XML ADD:

        android:onClick="onButtonClick"
    

    ON MAINACTIVITYCLASS:

        public class MainActivity extends AppCompatActivity {
           Private Button myButton;
           @Override
           protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
           }
           public void onButtonClick(View v){
              // button actions
           }
        }
    

    注意:我发现(需要确认)3°方式不是一个好习惯,因为框架集不支持。

    如果您有更强大的良好编码解决方案,请添加它。

    请尝试清除良好做法和不良做法的差异,以及为什么某些事情更正确或者是一个糟糕的解决方案。

    希望这对其他人有用, 我写这篇文章也是因为我读的很多帖子都很老了。 谢谢。

2 个答案:

答案 0 :(得分:1)

我建议使用Butterknife库进行绑定和OnClick方法。在我看来,定义它是最明确的方式。

Butterknife:http://jakewharton.github.io/butterknife/

示例:

@OnClick(R.id.submit)
public void sayHi(Button button) {
    button.setText("Hello!");
}


@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void pickDoor(DoorView door) {
   if (door.hasPrizeBehind()) {
      Toast.makeText(this, "You win!", LENGTH_SHORT).show();
   } else {
      Toast.makeText(this, "Try again", LENGTH_SHORT).show();
   }
}

答案 1 :(得分:0)

我更喜欢在xml布局中设置onclick的方法,并定义switch块来处理基于id的不同事件。与使用一堆匿名内部类相比,此方法更具可读性并且具有更好的性能。

*