【问题标题】:Android: Propagate parent state to child viewAndroid:将父状态传播到子视图
【发布时间】:2011-09-19 01:19:11
【问题描述】:

我遇到了一些我基本上不知道如何解决的问题。我有一个带有一些子组件的 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> 

样式 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 时,它的源图像没有改变。

我在这里遗漏了什么吗? 感谢关注 T

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

    【讨论】:

    • 尽管没有完全回答问题,android:duplicateParentState="true" 正是我想要的。
    • 他问如何将状态从父级传播到子级。不是相反。
    【解决方案2】:

    如果我们能看到您的 content_page_large_text 样式,这将是一个更容易跟踪的问题。另外,我看不到您实际上是如何设置颜色的,您的 background_view_rounded_top 是 &lt;selector&gt; 元素还是您将其设置在活动的侦听器中?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2017-07-04
      • 2021-09-26
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多