Android布局:在XML布局中定义onClick,它引用超类中的方法
我的活动中有一个名为Android布局:在XML布局中定义onClick,它引用超类中的方法,android,layout,onclicklistener,clicklistener,Android,Layout,Onclicklistener,Clicklistener,我的活动中有一个名为LoginActivity的按钮,它源自BaseActivity。在其布局文件中,我有以下声明: <ImageButton android:id="@+id/backPressed" style="@style/Widget.AppCompat.ActionButton" android:layout_width="?attr/actionBarSize" android:layout_height
LoginActivity
的按钮,它源自BaseActivity
。在其布局文件中,我有以下声明:
<ImageButton
android:id="@+id/backPressed"
style="@style/Widget.AppCompat.ActionButton"
android:layout_width="?attr/actionBarSize"
android:layout_height="?attr/actionBarSize"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:onClick="act"
android:src="@drawable/ic_arrow_back" />
而它是在超类中定义的。我想知道我应该如何引用BaseActivity.act(..)
在LoginActivity
的内部布局
下面是BaseActivity.act()的声明:
最初,我看到两个修复。此外,还有一些要点你必须考虑。
重写子类中的act并调用父方法
public class BaseActivity extends Activity {
public void act(View view) {
// Implementation
}
}
public class LoginActivity extends BaseActivity {
@Override
public void act(View view) {
super.act(view);
}
}
保持实施的最终性
正如你提到的,你的方法是最终的。因此,如果希望将实现仅保留在BaseActivity中,可以执行以下操作:
public class BaseActivity extends Activity {
public final void handleAct(View view) {
// Implementation
}
}
public class LoginActivity extends BaseActivity {
@Override
public void act(View view) {
handleAct(view);
}
}
所有活动都有相同的行为吗?
你可以考虑的另一点是,你的基类应该实现所有子活动都通用的方法。如果
act
仅与LoginActivity
相关,则不应在BaseActivity
中实现,而应仅在LoginActivity
中实现。。否则,任何扩展BaseActivity
的类都将不必要地携带act方法
编辑
检查评论。也许,您只需将public
添加到方法签名:
public fun act(view: View) {
...
}
覆盖LoginActivity中的方法,并调用super(视图)…@W0rmH0le感谢您的帮助。超类中的方法定义为final(而不是open
)。让act方法打开
仅调用super.act
,这是一种好的体验吗?当您引用xml中必须是公共的方法时,这没有问题。如果您不想在任何情况下重写方法,则final非常有用。因为这是你的项目,你可以控制它,所以没有问题。另一个选项是:在子类中创建一个方法act。在parent中,创建具有不同签名的最终方法:handleAct()。然后,子方法(act)调用该父方法(handleAct)。这样,您就可以将父方法保留为最终方法。@W0rmH0le请将这些解释作为答案
public class BaseActivity extends Activity {
public final void handleAct(View view) {
// Implementation
}
}
public class LoginActivity extends BaseActivity {
@Override
public void act(View view) {
handleAct(view);
}
}
public fun act(view: View) {
...
}