Android:将父状态传播给子视图

问题描述:

我遇到了一些我基本上不知道如何解决的问题。我有它的一些孩子compenents,喜欢的ImageView,TextView的等等,一个例子可以在下面的XML可以看到的LinearLayout:Android:将父状态传播给子视图

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
style="@style/list_buttom_top"> 

<LinearLayout android:gravity="center_vertical" 
    android:paddingLeft="10dip" 
    android:orientation="vertical" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1.0"> 

    <TextView android:text="title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/title" 
     style="@style/content_page_large_text" /> 

    <TextView android:text="summary" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/subtitle" 
     android:visibility="visible" 
     style="@style/content_page_small_text" /> 
</LinearLayout> 

<TextView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/itemCount" 
    android:visibility="gone" 
    style="@style/content_page_large_count_text" /> 

<ImageView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/chevron" 
    style="@style/list_buttom_chevron" /> 

</LinearLayout> 

风格list_buttom_top说,当年的LinearLayout处于按下状态,背景颜色需要改变,到目前为止这是工作。问题是content_page_large_text也表示TextView的文本颜色也需要改变,但它不会发生。当我点击LinearLayout时,唯一改变的是它的背景。

<style name="list_buttom_top"> 
<item name="android:clickable">true</item> 
<item name="android:paddingTop">10dip</item> 
<item name="android:paddingBottom">10dip</item> 
<item name="android:paddingLeft">10dip</item> 
<item name="android:paddingRight">10dip</item> 
<item name="android:gravity">center_vertical</item> 
<item name="android:background">@drawable/background_view_rounded_top</item> 
</style> 

<style name="list_buttom_chevron"> 
    <item name="android:paddingLeft">4.0dip</item> 
    <item name="android:paddingTop">2.0dip</item> 
    <item name="android:paddingRight">4.0dip</item> 
    <item name="android:paddingBottom">2.0dip</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:src">@drawable/chevron</item> 
</style>  

我试过在我的TextViews中使用这个android:duplicateParentState =“true”,但它也没有工作。 ImageView也是如此,当我点击LinearLayout时,ImageView没有改变它的源图像。

我在这里错过了什么吗? 感谢您的关注 T

如果我们能够看到您的content_page_large_text样式,这将是一个更容易的问题。另外,我不明白你是如何设置颜色的,你的background_view_rounded_top一个<selector>元素,还是你将它设置在活动中的一个监听器中?

但是,我最近还发现android:duplicateParentState =“true”不是我认为是的灵丹妙药。

如果这两个解决方案耗尽,那么我的解决方案通常是根布局的自定义组件。 http://developer.android.com/guide/topics/ui/custom-components.html 但是,如果界面很简单,那可能没有必要。我很确定你可以用StateListDrawable s来做到这一点。

自定义组件通常比试图找到xml变量的魔力组合更容易,并且如果您计划使其变得更加复杂,将会使布局更易于理解/可编辑。

我认为你应该在线性布局中设置android:addStatesFromChildren="true",这样子女的状态就会传播给父母。

此外,请确保不要结合这与android:duplicateParentState="true",因为它会导致堆栈溢出异常(基本上导致无限的参考循环)。

+5

即使不完全回答这个问题,android:duplicateParentState =“true”'正是我所期待的。 – PureSpider

+0

感谢@SMR的编辑... –

+0

他问如何从父母传播状态到孩子。而不是相反。 –