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