我的布局包含一个标题,其中我包含在每个Activity中,在此标题中有一个图像按钮。是否可以为此imageButton写一个常见的onClick事件?
答案 0 :(得分:10)
您可以编写一个扩展OnClickListener和onClick方法的类。然后在每个活动的onCreate方法中,找到ImageButton并将其onClickListener设置为该类:
MyOnclickListener implements OnClickListener {
private Context context;
public MyOnclickListener(Context context) {
this.context = context;
}
@Override
public void onClick(View arg0) {
Intent intent = new Intent(context, MyActivity.class);
context.startActivity(intent);
}
}
在您的活动中:
protected void onCreate(...) {
setContentView(...);
((ImageButton) findViewById(R.id.mybutton)).setOnClickListener(new MyOnclickListener(this));
}
编辑:对不起,当然是实现。
EDIT2:查看上下文参考的更新代码。
答案 1 :(得分:1)
是。创建一个实现所需侦听器的单例类,并将该实例添加到每个屏幕上的按钮。
答案 2 :(得分:1)
cant0na 和 Juhani 提供的答案很可能是您正在寻找的答案(关于 cant0na 的答案的小记录) )。如果您需要更自我维护和容错的解决方案,您可以定义自己的“小部件”来处理自己的事件。为此你需要:
此解决方案的好处是您不必在每个将显示标题的活动中添加常用OnClickListener的新实例。您只需将标题添加到您的活动布局-XML(请参阅下面的示例代码),而不是其他内容。万无一失。您还可以通过这种方式获得更加“解耦”的代码(您的标头不依赖于应用程序及其活动的任何实现细节)。
缺点是它是一个更复杂的解决方案,对于小型项目来说似乎有点过度杀戮。如果要对按钮单击执行任何特定于活动的操作,保持此解决方案“解耦”也有点棘手。您可能希望在MyHeader
类中结合“代码注入”考虑“默认行为”。然后代码注入需要在与默认行为不同的活动中对头类(注入onClick实现)进行进一步操作。
示例header.xml
<com.dbm.widget.MyHeader
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:layout_width="60dp"
android:layout_height="20dp"
android:src="@drawable/myIcon"
android:id="@+id/myButton" />
</com.dbm.widget.MyHeader>
示例MyHeader.java
package com.dbm.widget;
public class MyHeader extends LinearLayout implements OnClickListener {
// Constructor.
public MyButton() {
((ImageButton) findViewById(R.id.myButton)).setOnClickListener(this);
}
// OnClick event callback.
public void onClick(View view) {
// Do whatever you need to do here.
}
}
示例activity.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.dbm.MyHeader
android:layout_width="match_parent"
android:layout_height="20dp" />
<!-- Your other content goes here -->
</LinearLayout>