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.

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

Переопределите класс 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 .

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