Android:即使指定duplicateParentState,子元素也与父级共享压缩状态

时间:2011-07-19 03:10:14

标签: android android-layout

我有一个SlidingDrawer元素,其中包含一个包含一些Button子元素的RelativeLayout元素:

<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 个答案:

答案 0 :(得分:25)

使用子类重写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的实例。

答案 1 :(得分:9)

无需将duplicateParentState设置为false。如果您以某种方式使父点击可能会发生这种情况。默认情况下,按下的状态将传播给子项。确保您的LinearLayout和RelativeLayout不可点击。

答案 2 :(得分:0)

与SeekBar情况相同。

设置SeekBar:

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

为我工作