Raul Agrait
Raul Agrait

Reputation: 6018

Android: Child elements sharing pressed state with their parent even when duplicateParentState specified

I have a SlidingDrawer element which contains a RelativeLayout element which contains some Button child elements:

<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 and bar.xml have selectors which apply different images depending on the state:

<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>

The problem I am seeing is that when I click on the sliding drawer handle, the pressed state gets triggered for the buttons and they look pressed too, even though I've specified duplicateParentState to false.

Upvotes: 23

Views: 19970

Answers (3)

Vadim
Vadim

Reputation: 4463

Got same situation with SeekBar.

setting for SeekBar:

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

worked for me

Upvotes: 0

Raul Agrait
Raul Agrait

Reputation: 6018

Override the LinearLayout class with a subclass. In that subclass override the setPressed method and do nothing like so:

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.
    }
}

Replace LinearLayout with an instance of UnpressableLinearLayout.

Upvotes: 27

Romain Guy
Romain Guy

Reputation: 98501

There is no need to set duplicateParentState to false. This would happen if you make the parent clickable somehow. By default, the pressed state is propagated to the children. Make sure your LinearLayout and RelativeLayout are not clickable.

Upvotes: 12

Related Questions