Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.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 单击带有自定义主题的按钮时崩溃_Android_Android Layout_Android Activity - Fatal编程技术网

Android 单击带有自定义主题的按钮时崩溃

Android 单击带有自定义主题的按钮时崩溃,android,android-layout,android-activity,Android,Android Layout,Android Activity,我正在为按钮创建一个自定义主题,并使用xml本身的android:onClick按钮事件来处理按钮的点击 由于某种原因,它崩溃了,但有以下例外 java.lang.IllegalStateException:在id为“button1”的视图类android.widget.Button上的活动类android.View.ContextThemeWrapper中找不到onClick处理程序的方法MyOnClick(View) 如果我只是从按钮中删除theme属性,它就可以正常工作了,下面是我的按钮主

我正在为按钮创建一个自定义主题,并使用xml本身的
android:onClick
按钮事件来处理按钮的点击

由于某种原因,它崩溃了,但有以下例外

java.lang.IllegalStateException:在id为“button1”的视图类android.widget.Button上的活动类android.View.ContextThemeWrapper中找不到onClick处理程序的方法MyOnClick(View)

如果我只是从按钮中删除theme属性,它就可以正常工作了,下面是我的按钮主题

    <style name="ButtonTheme" parent="@android:style/Widget.Button">
        <item name="android:textColor">#FF0000</item>
        <item name="android:shadowColor">#FF000000</item>
    </style>

那么,撞车的原因是什么?如果我从xml中删除按钮小部件的
android:theme=“@style/ButtonTheme”
属性,我就能够处理单击事件。

有时当我们向
按钮添加样式时,它会影响默认的安卓可单击行为

尝试在


您还可以将
true
添加到按钮样式中。

我从未见过有人将
android:theme
属性应用于个人
视图
,但经过一点谷歌搜索后,我发现这确实是可能的,但只有在安卓5.0之后

这一点可以在最后看到

还有更多细节

正如第二个链接所解释的,一个
ContextThemeWrapper
用于修改与基本
Context
关联的主题。但是,由于您的
活动
需要保留自己的主题,我只能想象一个新的
上下文包装器
被创建并指定为您的
视图
的新
上下文
。由于这个新的
上下文
不再是您的
活动
,因此您的回调函数在此不存在,您将得到您描述的错误

您可以自己使用调试器来证明这一点(我使用了AndroidStudio,但您可能可以使用您选择的IDE,细节可能会有所不同)

  • 在调试模式下运行应用程序,并设置
    主题
    属性
  • 当您获得异常时,stacktrace将包含一个对
    视图
    类的引用,它在该类中调用
    onClick
  • 使用此选项可在异常发生之前添加断点
  • 现在在调试模式下再次运行应用程序,单击按钮
  • 点击断点时,计算表达式
    getContext()
    。您将看到,这将返回类型为
    ContextThemeWrapper
    的对象,并且它将有一个成员
    mBase
    ,该成员指向实际的
    活动
    ,因此
    getContext()
    本身不会返回
    活动
    ,也没有您在
    活动
    上定义的回调函数
  • 现在删除
    主题
    属性,离开断点并再次运行应用程序
  • 当您点击断点时,再次计算表达式
    getContext()
    ,您将看到这一次它直接返回您的
    活动
    ,这就是如果您不设置
    主题
    属性,回调会起作用的原因

  • 简而言之,如果你想利用这个新功能,你似乎不能使用android:onClick属性,你必须手动分配一个
    OnClickListener
    ,如上所述

    在花了这么多时间之后,对我有效的方法是在code
    setTheme(R.style.AppToolbar)中应用主题;在onCreate()中,而不是从所有布局中删除所有android:OnClick。

    发布java代码…尝试使用旧方法删除android:OnClick属性并使用Button Button=(Button)findViewById(R.id.button1);setOnClickListener(new View.OnClickListener(){@Override public void onClick(View v){}});别忘了定义button@L-但是为什么呢?我想在xml本身中添加click事件,然后呢?伙计,我猜错误是您为每个按钮定义了相同的onClick方法(猜测您有多个按钮),但这是创建错误尝试为不同的按钮定义不同的函数名,并用java定义所有这些函数,尝试it@L-X我现在只有一个按钮,如果我有多个按钮,那么我可以通过在开关盒中使用
    view.getId()
    来定义它。按钮已经可以单击了,你没有发现我在单击按钮时崩溃吗?这是意外的行为。在中使用样式而不是主题button@AzmiAnsari但是我想知道主题不起作用的原因我们也可以使用
    android:onClick
    和片段,我已经用过了!我不是说你不能用它,我是说它没那么有用。我相信是这样的,因为您正在创建片段来模块化您的UI,然后使用onClick将其与特定活动紧密绑定。无论如何,这不是最初的问题,而且有点离题。我在最后删除了有争议的陈述,因为它没有增加答案。我还添加了调试说明,精确地显示了正在发生的事情,因此您可以自己验证这一点
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView1"
            android:layout_margin="20dp"
            android:onClick="MyOnClick"
            android:theme="@style/ButtonTheme"
            android:text="Button" />
    
    public void MyOnClick(View view) {
            switch (view.getId()) {
            case R.id.button1:
                getWindow().setStatusBarColor(getResources()
                                       .getColor(R.color.statusBarColor));
                getWindow().setNavigationBarColor(getResources()
                                       .getColor(R.color.statusBarColor));
                break;
    
            default:
                break;
            }
    
        }