Android 单击带有自定义主题的按钮时崩溃
我正在为按钮创建一个自定义主题,并使用xml本身的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属性,它就可以正常工作了,下面是我的按钮主
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
,如上所述在花了这么多时间之后,对我有效的方法是在codesetTheme(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;
}
}