在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 ?
答案 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");