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

Android: дочерние элементы разделяют нажатие на состояние со своим родителем, даже если duplicateParentState указан

У меня есть элемент 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 на false.

4b9b3361

Ответ 1

Отменить класс 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.

Ответ 2

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

Ответ 3

Получилась та же ситуация с SeekBar.

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

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

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