Android XML Layout Inflater 和抽象类

如果一个 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方法正在按预期工作......


怎么来的?


守着星空守着你
浏览 172回答 2
2回答

慕慕森

它似乎是兼容性功能或缺陷在 3 个不同的设备中,我有不同的行为(我只有 3 个设备来测试 SM-T825、T815Y 和 XT1603)在 SM-T825(棉花糖)中,我只有alter工作在 T815Y(棒棒糖)中,我一切正常......在 XT1603 (Kitkat) 中,我只能alter工作在对我的代码烦躁不安并进行了一些(未跟踪的)更改之后,我能够在所有 3 台设备中进行部署,并且具有正确的行为。似乎使 Android Studio 中的缓存无效并重新启动是解决问题的方法。

神不在的星期二

您确定更新和重置方法public在 ExampleActivity 类中有访问修饰符吗?因为 ParentExampleActivity 没有public这些抽象方法的访问修饰符。因此,当 android studio 在 ExampleActivity 中实现这些抽象方法时,它不会将它们公开。理想情况下,您的代码应如下所示:abstract class ParentExampleActivity extends AppCompatActivity{&nbsp; &nbsp; public abstract void reset(View view);&nbsp; &nbsp; public abstract void update(View view);}class ExampleActivity extends ParentExampleActivity {&nbsp; &nbsp; public void reset(View view) {...}&nbsp; &nbsp; public void update(View view) {...}&nbsp; &nbsp; public void alter(View view) {...}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java