首页 > 解决方案 > 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
        }
}

标签: androidlayoutonclicklistenerclicklistener

解决方案


最初,我看到了两个修复。此外,您必须考虑一些要点。

覆盖子类中的行为并调用父方法

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) {
    ...
}

推荐阅读