Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.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
Android布局:在XML布局中定义onClick,它引用超类中的方法_Android_Layout_Onclicklistener_Clicklistener - Fatal编程技术网

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