2017-02-23 112 views
0

我试图让我的代码更友好。最初,我已经设置了一个带有标准点击监听器的按钮,每按一次它就可以将编辑文本的值增加1。设置getter和setter方法

现在为了尝试保持它更有组织,我试图将点击监听器移动到它自己的类,它将托管一系列的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的能力。它将获取当前值并最终使用setter来设置新值。

另外作为一个附注,你已经注意到,我没有演示我自己的getter和setter,这是因为我对这个方法如何做到这一点有些困惑。

谢谢

+0

你想设置getter和setter方法为哪一类? –

+0

它将被设置为我的OnclickListener类,因为这是我需要它在按下按钮时获取值的地方。然后把它设置在我的主要类别 – Steven

+0

我还不清楚这个设置的最终目标是什么。 –

回答

0

我不知道你是否知道这一点,但你不必在所有使用匿名类或单独的类,但可以设置你的XML按钮android:onclick="onClickMethod",然后你只需在活动本身中定义方法。只要方法的形式为public void methodName(View v),这将与任何方法名称一起使用。事实上,这是官方Android Developers培训和参考中推荐的。因此,我会在我的活动类:

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和看到方法名,然后去该活动,并确切地看到它在做什么。与匿名类相比,它对我来说也不那么麻烦,并且在任何情况下,我都可能想以编程方式运行相同的代码,我可以访问该方法。此外,AndroidStudio会自动知道这两者已链接,因此它的所有功能(如findusages等)都可以使用此方法。

你可以看到更多关于此这里:https://developer.android.com/reference/android/widget/Button.html

+0

我知道我已经多次使用这种方法。我只是想将我的方法从主要活动中完全分开,并将它们放入自己的View.OnclickListener – Steven

+0

为此,我相信最简单的方法是使用观察者模式,类似于如何在一个片段中更改信息活动。这是多余的,因为根据定义,OnClickListener实现了相同的模式,因此这两个类将会彼此观察。无论哪种方式,我认为无论您如何尝试实施,您都需要在活动中使用其他方法。就我个人而言,我会坚持使用推荐的方法,因为看起来您只会创建更复杂的代码,而实际上更难以让其他开发人员阅读。 – drawinfinity

+0

我知道你来自哪里,但我要实现的方法数量将超过我的整个活动 – Steven

0

根据您的意见对我的回答以上我建议做这样的答案:https://stackoverflow.com/a/9977370/4888701,除了接口在监听器类中定义,你喂活动添加到侦听器构造器中,当您创建新的侦听器时。否则,它会工作相同。根据您可能编辑的值的数量,它可能会在您的活动中保存您的代码行。如果你正在做类似的事情,这也会使得监听器可以重用于其他活动,因为你可以在每个活动中实现该方法。

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

+0

是否只有一种方法将我当前的Onclick侦听器(代表第一个代码部分)移动到一个View 。单击监听器? – Steven

+0

据我所知,除非它是一个内部类。或者,您可以尝试将数据存储在活动和侦听器访问的单例类中。通过这种方式,数据与两者都是分离的,您可以随意编辑数据,并且可以让活动监听数据更改。 – drawinfinity

0

如果我理解你的用例,你不一定需要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)); 
     } 
} 
0
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"); 
    }