0

自学 PHP,现在学习 java 和 javascript。

在 java/android 中,将相同的事件侦听器添加到不同的组件是一种好习惯,如何判断哪个组件正在使用?

//set up view components
listTitleET     = (EditText) findViewById(R.id.listTitleEditText);
finishDateET    = (EditText) findViewById(R.id.finishDateEditText);

startDateET.setOnFocusChangeListener(v);        
finishDateET.setOnFocusChangeListener(v);

View.OnFocusChangeListener v = new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {           
            /************* 
             * Do something here
             * But how does one know which event is in use ..?

    }
};

提前致谢

4

3 回答 3

1

我总是喜欢为每个组件设置一个单独的事件侦听器,或者创建一个扩展事件侦听器的类并为每个组件创建一个单独的实例。我认为它更干净,更容易维护,因为它避免了长switchif...else if语句。所以,你可以做一些不同的事情:创建两个不同的View.OnFocusChangedListenersay v1and v2and use实例

startDateET.setOnFocusChangeListener(v1);        
finishDateET.setOnFocusChangeListener(v2);

其中被覆盖的方法具有与每个视图对应的适当代码。

或者您可以在每个EditText视图上设置一个 id 或标签,然后有一些逻辑,例如

if(v.getId.equals(...))
...
else if (v.getId().equals(...))
...

在被覆盖的方法中。如您所见,如果您选择稍后编辑您的代码,您可能需要解开这样一个长长的 if/switch 语句。

于 2013-07-22T18:09:22.260 回答
1

方法中的参数“v”onFocusChange告诉您View触发事件的原因。

从那里您甚至可以通过以下方式从侦听器本身访问侦听器:

v.getOnFocusChangeListener();

请注意,我建议您将侦听器的名称更改为“v”以外的名称,否则会很混乱。

编辑

注意:如果您需要访问匿名类(您的侦听器)之外的任何组件等的引用,您必须声明该组件(或任何东西)final

于 2013-07-22T18:10:05.743 回答
1

例如,您可以在 onClick 中使用相同的侦听器,您可以使用以下内容:

View.OnClickListener myListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     switch(v.getId())
     {
       case R.id.button:
       { 
        //do something
         break;
       }

       case R.id.button2 :
       {
         //do something
         break;
       }
     }
}

您只需要知道哪个视图引发了事件。

于 2013-07-22T18:12:14.357 回答