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

Thi*_*ago 16 android

我遇到了一些问题,我基本上不知道如何修复.我有一个LinearLayout,里面有一些子代码,比如ImageView,TextView等,下面的xml中可以看到一个例子:

<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> 
Run Code Online (Sandbox Code Playgroud)

样式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>    
Run Code Online (Sandbox Code Playgroud)

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

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

Yoe*_*der 39

我认为你应该android:addStatesFromChildren="true"在线性布局中设置,这样孩子们的状态就会传播到父级.

此外,请确保不要将其与此结合使用,android:duplicateParentState="true"因为它会导致堆栈溢出异常(基本上导致无限的引用循环).

  • 即使没有完全回答这个问题,`android:duplicateParentState ="true"`正是我所寻找的. (8认同)

And*_*rew 2

如果我们可以看到您的 content_page_large_text 样式,那么跟踪问题会更容易。另外,我不明白你实际上是如何设置颜色的,你的background_view_rounded_top是一个<selector>元素还是你在活动的监听器中设置它?

但是,是的,我最近也发现 android:duplicateParentState="true" 并不是我认为的万能药。

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

自定义组件通常比尝试找到 xml 变量的神奇组合更容易,并且如果您打算使布局变得更复杂,将使布局更易于理解/编辑。