android - Android布局:在XML布局中定义onClick,它引用超类中的方法
问题描述
我的活动中有一个名为的按钮,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" />
构建过程提示以下错误:
Corresponding method handler '`public void act(android.view.View)`' not found
虽然它是在超类中定义的。我想知道我应该如何BaseActivity.act(..)
参考LoginActivity
.
这是声明BaseActivity.act()
:
fun act(view: View) {
val context = view.context
when (view.id) {
R.id.backPressed-> //some stuff
}
}
解决方案
最初,我看到了两个修复。此外,您必须考虑一些要点。
覆盖子类中的行为并调用父方法
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 方法。
编辑
检查pankaj-kumar评论。也许,您所要做的就是添加public
到方法签名中:
public fun act(view: View) {
...
}
推荐阅读
- excel - 如何将代码从选择范围(输入框)切换到行数?
- dart - 如何在隔离内创建三个无限循环?
- testng - 有没有办法拦截 dataprovider 调用并更改它们的返回值?
- node.js - 我选择哪一种无头浏览器?
- excel - 如何使用 Gembox.Spreadsheet 调整 Excel 表格的大小?
- docker - 测试容器访问外部 docker 网络
- python - 使用 Python 在列表中查找匹配的字典对
- java - Gradle War Plugin:在项目根目录中创建一个中间目录
- c++ - 动态指向现有对象或创建新对象
- php - 如何根据 php ajax 请求中的第一个下拉列表在下拉列表中获取记录