Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向派生类中的onClickListener添加功能_Java_Android_Inheritance_Button_Listener - Fatal编程技术网

Java 向派生类中的onClickListener添加功能

Java 向派生类中的onClickListener添加功能,java,android,inheritance,button,listener,Java,Android,Inheritance,Button,Listener,我读过很多关于如何使用onClickListener创建和处理按钮点击的文章。然而,我找不到任何解决这个问题的方法 我有一个类myActivity,我想创建第二个类myExtendedActivity,它通过添加一些额外的功能来扩展myActivity。 myActivity类包含大量代码,出于可维护性原因,我不想重复这些代码。myExtendedActivity的行为应该与myActivity完全相同,并具有一些额外的功能 特别是在myActivity中的onCreate方法中,我有以下代码将

我读过很多关于如何使用onClickListener创建和处理按钮点击的文章。然而,我找不到任何解决这个问题的方法

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

特别是在myActivity中的onCreate方法中,我有以下代码将onClickListener添加到我的_按钮中。扩展活动应该只向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只是广播一个意图,它不受侦听器中代码的任何其他部分的影响

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

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


非常感谢

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

在按钮的布局中,可以从xml定义onClickListener:

<Button
        android:id="@+id/myButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="handleButtonClick"
    />
在MyExtendedActivity中,您可以覆盖它:

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

    }
}

如果不修改
myActivity
,您就不能这样做,因为您正在实例化一个匿名类,并且子类无法“钩住”该匿名类

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

然后添加一个方法以获得正确的侦听器

myButton.setOnClickListener(createMyButtonsListener())
然后可以在提供扩展版本的子类中重写


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

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

您可以在
MyActivity
中使用类似的内容(的一些变体):

然后在
MyExtendeDactivity
中:

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

在超类中,以单独的方法提取onClick方法中执行的代码。之后,您可以在子类中使用super.yourMethod()来调用这个超类的方法。Alex DiCarlo使用一个不同的类作为侦听器的解决方案也是一个不错的解决方案。这是一个更干净的解决方案,因为您只使用了1个覆盖,并且需要最少的更改+非常感谢,我相信这可以解决我的问题。当我说我不想修改myActivity时,我的意思是我不想包含任何显式引用myExtendedActivity的代码。但是我可以将侦听器中的所有代码移动到一个单独的方法并重写它。对不起,这句话有误导性。
onCreate() {
    myButton.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v) 
        {
           myMethod();
        }
    });

}

protected void myMethod() {
    [...]   //a lot of code here
}
@Override
protected void myMethod() {
    super.myMethod();
    myExtraMethod();
}