Android 按钮(有时)不绘制状态列表xml背景

Android 按钮(有时)不绘制状态列表xml背景,android,button,background,Android,Button,Background,我的应用程序中有一个向导,用户可以使用“上一步”和“下一步”按钮在活动之间来回切换。这些按钮对于向导中的每个活动都是相同的,并且在它们自己的xml布局中定义,该布局包含在每个活动的布局中。他们有一个州列表作为背景,通常有效,但偶尔会发生这种情况: 预期: 实际: 按钮定义-添加导航按钮.xml 包括示例-一些_activity_layout.xml 状态列表定义-b_add_nav_button.xml 我完全困惑不解,任何帮助都将不胜感激。只是重复一下,大多数时候预期的行为都会发生,只是偶尔背

我的应用程序中有一个向导,用户可以使用“上一步”和“下一步”按钮在活动之间来回切换。这些按钮对于向导中的每个活动都是相同的,并且在它们自己的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);