【问题标题】:Setting up a getter and setter method设置 getter 和 setter 方法
【发布时间】:2017-02-23 16:43:47
【问题描述】:

我正在努力让我的代码对开发人员更加友好。最初,我设置了一个带有标准点击监听器的按钮,每次按下它时,只需将编辑文本的值增加 1。

现在,为了让它更有条理,我试图将点击监听器移到它自己的类中,该类将承载一系列 switch 语句。我遇到的唯一问题是能够为我的方法设置 getter 和 setter。

这是我当前的点击监听器

 testButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int time = Integer.valueOf(editHours.getText().toString());
                    time++;

                   editHours.setText(Integer.toString(time));
                }
            });

这是我单独的 case 语句,稍后可以链接。

public class MyClickListener implements View.OnClickListener {



@Override
public void onClick(View v) {

    switch (v.getId()){

        case R.id.testingButton:

            Log.i("Test", "Complete");


            break;

我只停留在设置 getter 和 setter 的能力上。它使用 getter 获取当前值,然后最终使用 setter 设置新值。

另外,作为旁注,您注意到我没有演示我自己的 getter 和 setter,这是因为我对如何为这个方法执行此操作有点困惑。

谢谢

【问题讨论】:

  • 你想为哪个类设置getter和setter方法?
  • 它将为我的 OnclickListener 类设置,因为我需要它在按下按钮时获取值。然后在我的主类上设置它
  • 我仍然不清楚您对此设置的最终目标是什么。
  • 基本上我不希望所有这些方法都挤满我的活动,所以我想要一个 View.OnclickListener 来存储 onclick,然后我稍后再引用它。例如 Btn.setOnclickListener(新方法名)

标签: android switch-statement onclicklistener getter-setter


【解决方案1】:

我不知道你是否知道这一点,但你不必使用匿名类,或者根本不需要单独的类,而是可以在 xml 中的按钮上设置android:onclick="onClickMethod",然后你只需在活动本身。只要方法的格式为public void methodName(View v),这将适用于任何方法名称。事实上,这是在官方Android 开发人员培训和参考中推荐的。因此我会在我的活动课上:

public void onTestClick(View v) {
    int time = Integer.valueOf(editHours.getText().toString());
    time++;

    editHours.setText(Integer.toString(time));
}

在xml中:

<Button 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onTestClick"
    />

我通常使用这种方法,因为开发人员可以查看 xml 并查看方法名称,然后转到 Activity 并查看它到底在做什么。在我看来,它也没有匿名类那么混乱,并且在任何情况下我可能想以编程方式运行相同的代码,我可以访问该方法。 AndroidStudio 也自动知道这两者是相关联的,因此它的所有功能(如 findusages 等)都可以使用此方法。

您可以在此处查看更多信息:https://developer.android.com/reference/android/widget/Button.html

【讨论】:

  • 我知道我已经多次使用过这种方法。我只想将我的方法与主活动完全分开并将它们放入自己的 View.OnclickListener
  • 要做到这一点,我相信最简单的方法是使用观察者模式,类似于在活动中拥有片段更改信息的方式。这有点多余,因为根据定义, OnClickListener 正在实现相同的模式,因此这两个类将相互观察。无论哪种方式,我认为无论您如何尝试实施,您都需要在活动中使用另一种方法。就我个人而言,我会坚持推荐的方法,因为看起来你只会创建更复杂的代码,实际上其他开发人员更难阅读。
  • 我了解您来自哪里,但我要实施的方法数量将超过我的整个活动
【解决方案2】:

根据您对我上面的回答的 cmets,我建议您执行以下操作:https://stackoverflow.com/a/9977370/4888701,除了接口是在您的侦听器类中定义的,并且您在创建新侦听器时将活动提供给侦听器构造函数。否则它会工作相同。根据您可能正在编辑的值的数量,它可能会在活动中保存或不保存代码行。如果您正在做类似的事情,这也将使侦听器可重用于其他活动,因为您可以在每个活动中实现该方法。

如果这增加了太多代码,您可以尝试将 Listener 类定义为 Activity 中的私有内部类。这样您就可以访问这些值,但至少可以选择在查看代码时隐藏类内容。

【讨论】:

  • 有没有办法将我当前在第一个代码部分中表示的 Onclick 侦听器移动到 View.Onclick 侦听器上?
  • 据我所知,除非它是一个内部类。或者,您可以尝试将数据存储在活动和侦听器都可以访问的单例类中。这样数据就与两者解耦了,你可以随意编辑它,你可以让activity监听数据的变化。
【解决方案3】:
public class MyClickListener extends AppCompatActivity implements View.OnClickListener {

EditText editHours;
Button testButton;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    editHours = (EditText)findViewById(R.id.editHours);
    testButton = (Button)findViewById(R.id.testingButton);



     testButton.setOnClickListener(new MyClickListener());
}

@Override
public void onClick(View v) {



    switch (v.getId()){


        case R.id.testingButton:

            Log.i("Test", "Complete");

            int time = Integer.valueOf(editHours.getText().toString());
            time++;

            editHours.setText(Integer.toString(time));




            break;

        default:
            Log.i("Test", "Complete");
    }

【讨论】:

    【解决方案4】:

    如果我了解您的用例,您不一定需要 getter/setter。为什么不使用类似的东西:

    public class EditTextIncrementor implements View.OnClickListener {
            private final EditText editText;
    
            public EditTextIncrementor(EditText editText){
                this.editText = editText;
            }
    
    
           @Override
           public void onClick(View v) {
               String counter = editText.getText().toString();
               int time = Integer.valueOf(counter);
               time++;
               editText.setText(Integer.toString(time));
           }
     }
    

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 2017-09-09
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多