Android 按钮(有时)不绘制状态列表xml背景
我的应用程序中有一个向导,用户可以使用“上一步”和“下一步”按钮在活动之间来回切换。这些按钮对于向导中的每个活动都是相同的,并且在它们自己的xml布局中定义,该布局包含在每个活动的布局中。他们有一个州列表作为背景,通常有效,但偶尔会发生这种情况: 预期: 实际: 按钮定义-添加导航按钮.xml 包括示例-一些_activity_layout.xml 状态列表定义-b_add_nav_button.xml 我完全困惑不解,任何帮助都将不胜感激。只是重复一下,大多数时候预期的行为都会发生,只是偶尔背景画不出来 我还应该补充一点,按钮在功能上仍然像预期的那样工作 编辑Android 按钮(有时)不绘制状态列表xml背景,android,button,background,Android,Button,Background,我的应用程序中有一个向导,用户可以使用“上一步”和“下一步”按钮在活动之间来回切换。这些按钮对于向导中的每个活动都是相同的,并且在它们自己的xml布局中定义,该布局包含在每个活动的布局中。他们有一个州列表作为背景,通常有效,但偶尔会发生这种情况: 预期: 实际: 按钮定义-添加导航按钮.xml 包括示例-一些_activity_layout.xml 状态列表定义-b_add_nav_button.xml 我完全困惑不解,任何帮助都将不胜感激。只是重复一下,大多数时候预期的行为都会发生,只是偶尔背
我添加了一些调试语句,并设法复制。显然,Android有时会将b_add_bav_button.xml解释为可彩色绘制,而不是StateListDrawable。我试着将形状从状态列表中拉出来,放入它们自己的xml文件中,没有任何风险。我仍然同样感到困惑。Android认为我使用的是ColorDrawable而不是StateListDrawable,这导致了上述行为。我仍然不知道为什么,但它与屏幕方向有关,它可以通过启动活动、弹出活动、旋转屏幕和再次启动活动来复制 我的工作是从xml选择器中取出,而是构建一个 StateListDrawable可编程,如下所示:
StateListDrawable d = new StateListDrawable();
d.addState(new int[]{ android.R.attr.state_pressed, android.R.attr.state_enabled },
this.getResources().getDrawable(R.drawable.b_add_nav_button_pressed));
d.addState(new int[]{ -android.R.attr.state_enabled },
this.getResources().getDrawable(R.drawable.b_add_nav_button_disabled));
d.addState(new int[]{ android.R.attr.state_enabled },
this.getResources().getDrawable(R.drawable.b_add_nav_button_normal));
bNext.setBackgroundDrawable(d);
有很多奇怪的地方,但我似乎让它工作了。Android认为我使用的是彩色绘图而不是StateListDrawable,这导致了上述行为。我仍然不知道为什么,但它与屏幕方向有关,它可以通过启动活动、弹出活动、旋转屏幕和再次启动活动来复制 我的工作是从xml选择器中取出,而是构建一个 StateListDrawable可编程,如下所示:
StateListDrawable d = new StateListDrawable();
d.addState(new int[]{ android.R.attr.state_pressed, android.R.attr.state_enabled },
this.getResources().getDrawable(R.drawable.b_add_nav_button_pressed));
d.addState(new int[]{ -android.R.attr.state_enabled },
this.getResources().getDrawable(R.drawable.b_add_nav_button_disabled));
d.addState(new int[]{ android.R.attr.state_enabled },
this.getResources().getDrawable(R.drawable.b_add_nav_button_normal));
bNext.setBackgroundDrawable(d);
有很多奇怪的地方,但我似乎让它工作起来了。把一个文件a_dummy_magic.xml作为最顶级的可绘制资源-它可以被固定到位。只有安卓SDK才有这种不合理的行为。相信我。我经历了这一过程,花了整整一周的时间才发现了这个窍门。将一个文件a_dummy_magic.xml作为最顶级的可绘制资源—它可以被固定到位。只有安卓SDK才有这种不合理的行为。相信我。我经历了这一过程,花了整整一周的时间来发现这个窍门。在它失败之前会发生什么?没有,没有崩溃或任何错误消息或任何东西。此外,它在模拟器中是不可复制的,很难在实际手机上复制,尽管有些手机似乎比其他手机更容易复制。我的想法是,这是与缓存相关的问题。您是否可以尝试将您的形状xml放在一个drawable中,并在选择器中使用android:drawable=@drawable/shape_xml传递它?在它失败之前会发生什么?没有,没有崩溃或任何错误消息或其他信息。此外,它在模拟器中是不可复制的,很难在实际手机上复制,尽管有些手机似乎比其他手机更容易复制。我的想法是,这是一些与缓存相关的问题。你能试着将你的形状xml放在一个drawable中,并在你的选择器中用android:drawable=@drawable/shape_xml传递它吗?我不知道为什么这样做有效,但它确实有效。在许多显示这种行为的按钮中,我只有一个按钮。我希望添加一个虚拟文件最多只能将问题转移到另一个按钮。然而,这似乎解决了这个问题。我相信我的失败版本也只发生在SDK中。我不知道为什么会这样,但它确实起了作用。在许多显示这种行为的按钮中,我只有一个按钮。我希望添加一个虚拟文件最多只能将问题转移到另一个按钮。然而,这似乎解决了这个问题。我相信我的失败版本也只发生在SDK中。
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false">
<shape>
<gradient
android:startColor="#C7C7C7"
android:endColor="#8B8B8B"
android:angle="270">
</gradient>
<stroke
android:width="1dp"
android:color="#8B8B8B">
</stroke>
<padding
android:left="10dp"
android:right="10dp"
android:top="10dp"
android:bottom="10dp">
</padding>
</shape>
</item>
<item android:state_pressed="true" >
<shape>
<solid
android:color="#FFA319" />
<padding
android:left="10dp"
android:right="10dp"
android:top="10dp"
android:bottom="10dp" />
</shape>
</item>
<item>
<shape>
<gradient
android:startColor="#4F4FB2"
android:endColor="#24248F"
android:angle="270">
</gradient>
<stroke
android:width="1dp"
android:color="#24248F">
</stroke>
<padding
android:left="10dp"
android:right="10dp"
android:top="10dp"
android:bottom="10dp">
</padding>
</shape>
</item>
</selector>
StateListDrawable d = new StateListDrawable();
d.addState(new int[]{ android.R.attr.state_pressed, android.R.attr.state_enabled },
this.getResources().getDrawable(R.drawable.b_add_nav_button_pressed));
d.addState(new int[]{ -android.R.attr.state_enabled },
this.getResources().getDrawable(R.drawable.b_add_nav_button_disabled));
d.addState(new int[]{ android.R.attr.state_enabled },
this.getResources().getDrawable(R.drawable.b_add_nav_button_normal));
bNext.setBackgroundDrawable(d);