代码之家  ›  专栏  ›  技术社区  ›  Igor ČordaÅ¡

如何最好使用xml为tabwidget按钮设置禁用状态的样式

  •  1
  • Igor ČordaÅ¡  · 技术社区  · 11 年前

    我有以下问题。我想为选项卡禁用状态添加特殊图像,但它不起作用。这就是我在选择器中所做的。

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:drawable="@drawable/active" android:state_pressed="true"/>
    <item android:drawable="@drawable/unactive" android:state_selected=true"/>
    <item android:drawable="@drawable/disabled" android:state_enabled="false"/>
    <item android:drawable="@drawable/unactive"/>
    
    </selector>
    

    这与单个“独立”按钮的选择器完全相同,但它不起作用,即使按钮处于启用状态,它也会显示禁用状态。我做错了什么?

    编辑:感谢@NightCrawler的建议,我发现这是活动-非活动状态的最佳选择器,但当按钮被禁用时,我仍然无法使state_enabled=“false”显示不同的状态。。。

    <item android:drawable="@drawable/active" android:state_selected="true"/>
    <item android:drawable="@drawable/unactive" android:state_selected="false"/>
    <item android:drawable="@drawable/disabled" android:state_enabled="false"/>
    <item android:drawable="@drawable/unactive"/>
    

    解决方案:我接着用以下代码实现了禁用状态的图像更改:

    tabWidget.getChildAt(4).setEnabled(true);
    icon = (ImageView) wrapper.tabWidget.getChildAt(4).findViewById(R.id.icon);
    icon.setImageResource(R.drawable.enabled)
    
    tabWidget.getChildAt(4).setEnabled(false);
    icon = (ImageView) wrapper.tabWidget.getChildAt(4).findViewById(R.id.icon);
    icon.setImageResource(R.drawable.disabled)
    

    这确实可以,但我仍然想知道是否可以使用ONLY XML为选项卡小部件中的按钮定义禁用状态。

    调查结果: 所以,经过更多的修改,我发现了为什么残疾人州没有注册。在我的例子中,我使用自定义的按钮布局,这可能是任何自定义tabhost的人都会做的,并且可能会在该布局中有某种图像。用上面定义的状态绘制的图像将应用于布局中的图像,而不是整个布局。即使是这个选择器也足以具有3种所需状态:

    <item android:drawable="@drawable/menu_network_active" android:state_selected="true"/>
    <item android:drawable="@drawable/menu_network_offline" android:state_enabled="false"/>
    <item android:drawable="@drawable/menu_network_unactive"/>
    

    但当你禁用tabwidget按钮时,你必须手动将你在其中使用的图像设置为禁用,就像这样:

    wrapper.tabWidget.getChildAt(0).setEnabled(false);
    icon = (ImageView) wrapper.tabWidget.getChildAt(0).findViewById(R.id.icon);
    icon.setEnabled(false);
    

    在这种情况下,在图像上触发禁用选择器状态,并显示所需的背景。

    仍未解释:

    这个谜题中唯一缺少的是,为什么选择选项卡按钮时会触发图像的选定状态,而不是禁用状态。我甚至尝试在“图标”上设置侦听器,看看当您更改选项卡时是否会调用这些侦听器,但这并没有发生,并且选择器中的静止图像被设置为选中。所以基本上选择是在布局中的图像上触发的(不知何故),但禁用不是,我不知道为什么。 如果有人看到这个问题有一些发现,请添加评论或答案以供功能参考。 对于那些只想解决类似错误的人,只需阅读WOKRAROUND或FINDINGS部分,因为这些可能会为你解决问题。

    1 回复  |  直到 11 年前
        1
  •  3
  •   Snehal Poyrekar Brijesh Patel    11 年前
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <!-- Non focused states -->
        <item android:drawable="@drawable/footer" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/>
        <item android:drawable="@drawable/footer_pressed" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/>
    
        <!-- Pressed -->
        <item android:drawable="@drawable/footer_pressed" android:state_pressed="true" android:state_selected="true"/>
        <item android:drawable="@drawable/footer_pressed" android:state_pressed="true"/>
    
    </selector>`enter code here`