运行时相当于(XML)android:onClick?

时间:2014-02-25 15:18:47

标签: android

在1.6中实现Android按钮处理程序的一种方法是将它放在声明按钮的XML中。 。 。

...
android:onClick="TheButtonHandler"
...

然后将处理程序例程放在Activity类中。 。 。

   public void TheButtonHandler(View target) {
    // ... button handler code
 }

我有一些Android代码,其中所有按钮都是在运行时在初始化时用Java创建的,而不是用XML创建的,但我想做与上述XML相同的工作,包括指定按钮处理程序。 NB 我希望按钮处理程序位于各自独立的例程中,就像我在上面的示例中用XML声明它们一样,我不希望按钮处理程序代码嵌入到我的初始化代码。

我见过使用 setOnClickListener 的示例,但处理程序代码始终嵌入内联,例如,

  demoButton.setOnClickListener(new Button.OnClickListener(){
  @Override
  public void onClick(View arg0) {
               // ... button handler code     
  }});

...这是我不想要的地方,因为这会将按钮处理程序代码放在按钮初始化的位置。什么是Java运行时相当于 android:onClick

4 个答案:

答案 0 :(得分:2)

方法1

public class YourActivity extends Activity implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //....

        myButton1.setOnClickListener(this);
        myButton2.setOnClickListener(this);
        myButton3.setOnClickListener(this);
        myButton4.setOnClickListener(this);



        myButton1.setTag(0);
        myButton2.setTag(1);
        myButton3.setTag(2);
        myButton4.setTag(3);
    }

    @Override
    public void onClick(View v) {
        //Do your stuff
        switch ((int) v.getTag()) {

            case 0:
                //First button pressed;
                break;
            case 1:
                //Second button pressed;
                break;
            case 2:
                //Third button pressed;
                break;
            case 3:
                //Fourth button pressed;
                break;
            default:
                //Unknown value, handle an error
                break;
        }
    }
}

方法2

public class YourActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //....

        myButton1.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View arg0) {
               // ... button handler code     
            }
        });

        myButton2.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View arg0) {
               // ... button handler code     
            }
        });

        myButton3.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View arg0) {
               // ... button handler code     
            }
        });

        myButton4.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View arg0) {
               // ... button handler code     
            }
        });
    }
}

答案 1 :(得分:2)

等效于setOnClickListener()View.OnClickListener

如果你examine the platform source,你会看到用onClick属性定义的方法被转换为通过Java反射调用命名方法的OnClickListener

  

我已经看过使用setOnClickListener的示例,但处理程序代码总是嵌入内联...这是我不想要它的地方,因为这会将按钮处理程序代码放在按钮初始化的位置

您可以拥有OnClickListener例如像这样的成员变量:

private OnClickListener mClickListener = new OnClickListener() { ... };

//

    view.setOnClickListener(mClickListener);

在不同的地方进行初始化和点击处理。

答案 2 :(得分:1)

如果这是你要求的内容,你不必将它们包括在内。 您可以创建自己的类,例如:

MyButtonClickListener implements Button.OnClickListener
{
  ...
}

这可以在其他地方定义。然后你可以在初始化代码中类似地引用它,但不会占用太多的可读性空间。

demoButton.setOnClickListener(new MyButtonClickListener());

如果这确实是你的问题。

答案 3 :(得分:0)

正如@laalto已经指出的那样,Android View本身只是使用处理程序的名称并使用Java反射来创建OnClickListener对象。我从View.java中挖掘出代码并将其包装在一个单独的对象中:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.Activity;
import android.view.View;

public class ViewOnClickHandler implements View.OnClickListener{

    Activity mActivity;
    Method mHandler;
    ViewOnClickHandler(Activity activity, View view, String handlerName){
        mActivity = activity;
        try {
            mHandler = activity.getClass().getMethod(handlerName, View.class);
        } catch (NoSuchMethodException e) {
            int id = view.getId();
            String idText = id == View.NO_ID ? "" : " with id '"
                    + mActivity.getResources().getResourceEntryName(id) + "'";
            throw new IllegalStateException("Could not find a method " +
                    handlerName + "(View) in the activity "
                    + activity.getClass() + " for onClick handler"
                    + " on view " + view.getClass() + idText, e);
        }           
    }
    @Override
    public void onClick(View v) {
        try {
            mHandler.invoke(mActivity, v);
        } catch (IllegalAccessException e) {
            throw new IllegalStateException("Could not execute non "
                    + "public method of the activity", e);
        } catch (InvocationTargetException e) {
            throw new IllegalStateException("Could not execute "
                    + "method of the activity", e);
        }
    }

    static void set(Activity activity, View view, String handlerName){
        view.setOnClickListener(new ViewOnClickHandler(activity, view, handlerName));

    }
}

如果您将此代码放在您选择的软件包中并将该类导入您的活动中,则样本中的代码可缩小为:

ViewOnClickHandler.set(this, demoButton, "TheButtonHandler");