0

我已经阅读了许多关于如何使用 onClickListener 创建和处理按钮点击的主题。但是,我找不到任何解决此问题的方法。

我有一个类 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,它不受 Listener 中代码的任何其他部分的影响。

我想做的是扩展 myExtendedActivity 中的 OnClickListener,以便它首先执行为 myActivity 编写的代码,而不是在 myExtendedActivity 中定义的 myExtraMethod。

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

非常感谢

4

3 回答 3

2

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

您可以在(模板方法模式MyActivity的某些变体)中使用类似的东西:

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();
}
于 2013-01-17T21:09:31.833 回答
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

    }
}
于 2013-01-17T21:05:08.797 回答
0

如果不修改myActivity,则不能,因为您正在实例化一个匿名类,并且子类无法“挂钩”到该匿名类。

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

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

myButton.setOnClickListener(createMyButtonsListener())

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

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

于 2013-01-17T21:06:00.173 回答