用于android中每个活动的常用按钮onClick

时间:2011-02-15 10:30:57

标签: android

我的布局包含一个标题,其中我包含在每个Activity中,在此标题中有一个图像按钮。是否可以为此imageButton写一个常见的onClick事件?

3 个答案:

答案 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 的答案的小记录) )。如果您需要更自我维护和容错的解决方案,您可以定义自己的“小部件”来处理自己的事件。为此你需要:

  • 将描述标题的xml-layout文件。
  • 一个自定义类,它将(自动)膨胀上述XML布局并管理任何“常见事件”。

此解决方案的好处是您不必在每个将显示标题的活动中添加常用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>