Подтвердить что ты не робот

Android: распространять родительское состояние на дочерний режим

У меня возникла какая-то проблема: я вообще не знаю, как это исправить. У меня есть LinearLayout с некоторыми дочерними compenents в нем, например 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>    

Я пробовал использовать этот андроид: duplicateParentState = "true" в моем TextViews, но он также не работал. То же самое происходит и с ImageView, который не меняет исходное изображение, когда я нажимаю LinearLayout.

Я что-то упустил? Спасибо за внимание Т

4b9b3361

Ответ 1

Было бы проще проследить, мог ли мы видеть ваш стиль content_page_large_text. Кроме того, я не вижу, как вы на самом деле устанавливаете цвет, является ли ваш элемент background_view_rounded_top a <selector> или вы устанавливаете его в прослушивающем элементе в активности?

Но я также недавно обнаружил, что андроид: duplicateParentState = "true" - это не панацея, о которой я думал.

Если эти два решения будут исчерпаны, то мое решение для перехода обычно является настраиваемым компонентом корневого макета. http://developer.android.com/guide/topics/ui/custom-components.html Но это может быть необязательно, если интерфейс прост. Я уверен, что вы можете сделать это с помощью StateListDrawable s.

Пользовательские компоненты обычно проще, чем пытаться найти магическую комбинацию переменных xml, и сделают макет более понятным/редактируемым позже, если вы планируете сделать это более сложным.

Ответ 2

Я думаю, что вы должны установить android:addStatesFromChildren="true" в линейном макете, таким образом, дочернее состояние распространяется на родителя.

Кроме того, убедитесь, что НЕ объединить это с android:duplicateParentState="true", поскольку это вызовет исключение (в основном вызывает бесконечный опорный цикл).