向派生类中的onClickListener添加功能

时间:2013-01-17 20:56:42

标签: java android inheritance button listener

我已经阅读了很多关于如何使用onClickListener创建和处理Button点击的线程。但是,我找不到任何解决这个问题的东西。

我有一个类myActivity,我想创建第二个类myExtendedActivity,它通过添加一些额外的功能来扩展myActivity。 myActivity类包含很多代码,出于可维护性的原因,我不想复制。 myExtendedActivity的行为与myActivity完全相同,但有一些额外的功能。

特别是在myActivity的onCreate方法中,我有以下代码将onClickListener添加到my_button。扩展活动应该只是调用myExtraMethod。

myButton = (Button)findViewById(R.id.my_button); 
myButton.setOnClickListener(new View.OnClickListener() 
{
    public void onClick(View v) 
    {
        [...]   //a lot of code here

        myExtraMethod();

    }
});

请注意,myExtraMethod只是广播一个Intent,它不受监听器中代码的任何其他部分的影响。

我想要做的是扩展myExtendedActivity中的OnClickListener,使其首先执行为myActivity编写的代码,而不是myExtendedActivity中定义的myExtraMethod。

我不想修改myActivity,如果myExtendedActivity包含在项目中,我应该完全不知道。

非常感谢

3 个答案:

答案 0 :(得分:1)

完全没有修改myActivity几乎是不可能的。

您可以在MyActivityTemplate method pattern的某些变体)中使用类似的内容:

onCreate() {
    myButton.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v) 
        {
           myMethod();
        }
    });

}

protected void myMethod() {
    [...]   //a lot of code here
}

然后在MyExtendedActivty

@Override
protected void myMethod() {
    super.myMethod();
    myExtraMethod();
}

答案 1 :(得分:0)

如果我理解你的问题,解决方案可能是这样的:

在按钮布局中,您可以从xml:

定义onClickListener
<Button
        android:id="@+id/myButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="handleButtonClick"
    />

然后,在MyActivity中实现方法:

public void handleClick(View view) {

}

在MyExtendedActivity中,您可以覆盖它:

public class MyExtendedActivity extends MyActivity {
    @Override
    public void handleClick(View view) {
        super.handleClick(view);
        //your code goes here

    }
}

答案 2 :(得分:0)

不修改myActivity,你不能因为你实例化一个匿名类,并且子类无法“挂钩”到那个匿名类。

如果你可以修改myActivity,那么你可以从myButton.setOnClickListener(...)创建一个静态类的匿名类,并在你的子类中扩展调用super.onClick(v)的监听器类,然后是你的功能期望。

然后添加一个方法来获取正确的侦听器

myButton.setOnClickListener(createMyButtonsListener())

然后您可以在提供扩展版本的子类中覆盖。

或者,添加一个可以在子类中重写的方法(即myExtraMethod())。在你的匿名类中调用。