Android: дочерние элементы, совместно использующие нажатое состояние со своими родителями, даже если указано duplicateParentState - PullRequest
21 голосов
/ 19 июля 2011

У меня есть элемент SlidingDrawer, который содержит элемент RelativeLayout, который содержит некоторые дочерние элементы Button:

<SlidingDrawer>
  <RelativeLayout>
    <LinearLayout>
      <Button android:background="@drawable/foo.xml" android:duplicateParentState="false">
      <Button android:background="@drawable/bar.xml" android:duplicateParentState="false">
    </LinearLayout>
  </RelativeLayout>
</SlidingDrawer>

foo.xml и bar.xml имеют селекторы, которые применяют различные изображения в зависимости от состояния:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_focused="true" android:drawable="@drawable/foo_selected" />
  <item android:state_pressed="true" android:drawable="@drawable/foo_selected" />
  <item android:state_enabled="false" android:drawable="@drawable/foo_disabled" />
  <item android:drawable="@drawable/foo_normal" /> 
</selector>

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

Ответы [ 3 ]

26 голосов
/ 30 августа 2011

Переопределить класс LinearLayout подклассом.В этом подклассе переопределите метод setPressed и ничего не делайте так:

public class UnpressableLinearLayout extends LinearLayout
{
    @Override
    public void setPressed(boolean pressed)
    {
        // Do nothing here. Specifically, do not propagate this message along
        // to our children so they do not incorrectly display a pressed state
        // just because one of their ancestors got pressed.
    }
}

Замените LinearLayout экземпляром UnpressableLinearLayout.

9 голосов
/ 19 июля 2011

Нет необходимости устанавливать для duplicateParentState значение false. Это произойдет, если вы сделаете родитель кликабельным. По умолчанию нажатое состояние распространяется на детей. Убедитесь, что ваши LinearLayout и RelativeLayout не активируются.

0 голосов
/ 10 декабря 2018

С SeekBar такая же ситуация.

Настройка для SeekBar:

 android:clickable="true"
 android:focusable="true"

у меня сработало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...