为了账号安全,请及时绑定邮箱和手机立即绑定

Android XML Layout Inflater 和抽象类

Android XML Layout Inflater 和抽象类

守着星空守着你 2021-09-29 13:27:33
如果一个 Activity 扩展了一个抽象类,它定义了一个方法,那么为什么没有“找到”那个方法?我正在目睹 Android 中的一种行为,我无法判断它是否是预期的结果。我有一个带有方法的活动,该AppCompatViewInflater.onClick方法无法找到我有一个 Activity,在其中,我有 Button(s) 具有定义的android:onClick属性(“方法(视图视图)”):单击视图时要在此视图的上下文中调用的方法的名称。此名称必须对应于仅采用一个 View 类型参数的公共方法。例如,如果您指定 android:onClick="sayHello",则必须声明您的上下文(通常是您的 Activity)的 public void sayHello(View v) 方法。在我的示例中,我有以下类:父示例活动abstract class ParentExampleActivity extends AppCompatActivity{    abstract void reset(View view);    abstract void update(View view);}示例活动class ExampleActivity extends ParentExampleActivity {    public void reset(View view) {...}    public void update(View view) {...}    public void alter(View view) {...}}我有以下布局<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".ExampleActivity">            <Button                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:onClick="alter"                android:text="ALTER"/>            <Button                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:onClick="update"                android:text="UPDATE"/>            <Button                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:onClick="reset"                android:text="RESET"/>    </LinearLayout>但导致:java.lang.IllegalStateException:在视图类 android.support.v7.widget.AppCompatButton 上定义的 android:onClick 属性的父级或祖先上下文中找不到方法 update(View)但是,该alter方法正在按预期工作......怎么来的?
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

它似乎是兼容性功能或缺陷

在 3 个不同的设备中,我有不同的行为(我只有 3 个设备来测试 SM-T825、T815Y 和 XT1603)

在 SM-T825(棉花糖)中,我只有alter工作

在 T815Y(棒棒糖)中,我一切正常......

在 XT1603 (Kitkat) 中,我只能alter工作

在对我的代码烦躁不安并进行了一些(未跟踪的)更改之后,我能够在所有 3 台设备中进行部署,并且具有正确的行为。

似乎使 Android Studio 中的缓存无效并重新启动是解决问题的方法。


查看完整回答
反对 回复 2021-09-29
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

您确定更新和重置方法public在 ExampleActivity 类中有访问修饰符吗?因为 ParentExampleActivity 没有public这些抽象方法的访问修饰符。因此,当 android studio 在 ExampleActivity 中实现这些抽象方法时,它不会将它们公开。理想情况下,您的代码应如下所示:


abstract class ParentExampleActivity extends AppCompatActivity{

    public abstract void reset(View view);

    public abstract void update(View view);

}

class ExampleActivity extends ParentExampleActivity {

    public void reset(View view) {...}

    public void update(View view) {...}

    public void alter(View view) {...}

}


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信