【问题标题】:Best practice for buttons setOnClickListeners [duplicate]按钮 setOnClickListener 的最佳实践 [重复]
【发布时间】:2017-08-25 14:17:06
【问题描述】:

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

我会(作为主题)了解哪种方法是最好的方法,哪种方法(以及为什么)不是。

  1. 在活动(类)中调用私有函数并在其中设置监听器和所有强制转换:

    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. 通过将函数链接到 xml 文件中,只需作为带有参数 myView 的函数即可:

关于 MAINACTIVITY.XML 添加:

    android:onClick="onButtonClick"

关于 MAINACTIVITY 课程:

    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° 方式不是一个好的做法,因为框架集不支持。

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

请尝试澄清好的做法和坏做法的区别,以及为什么某些事情更正确或相反是一个糟糕的解决方案。

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

【问题讨论】:

标签: java android


【解决方案1】:

我建议将 Butterknife 库用于绑定和 OnClick 方法。在我看来,这是最明确的定义方式。

黄油刀: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();
   }
}

【讨论】:

  • 感谢您的建议,我会看到这个解决方案,但在实施新库之前,我更愿意了解 Android-studio 库的基础知识。
【解决方案2】:

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

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)
   {
      int id = v.getId();  
      switch(id)
         {
          case R.id.signinbutton: signin();break;
          case R.id.logoutbutton: logout();break;
         }
   }
}

【讨论】:

  • 我读到framsest不支持使用xml方法,你能确认一下吗?我需要框架。
  • @Marco 在将 html 加载到 android 时,android 会自动支持 html 中的框架集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2018-05-26
相关资源
最近更新 更多