Android SlidingDrawer doesn't disable buttons 'under' the drawer
Asked Answered
D

7

20

This is the scenario: I have a button B, and a slidingdrawer that when pulled out covers the entire screen. When I pull out the screen, and touch the screen where B used to be visible, its action is still executed.

How can I get around this?

I found this thread describing the very same problem, but no answer was accepted and the ones given I didn't manage to get working.

UPDATE: I have a file named Report.java, with a corresponding report.xml file as seen below.

    <SlidingDrawer
     android:id="@+id/drawer"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:handle="@+id/reportSlideButton"
     android:content="@+id/reportContent"
     android:orientation="horizontal">

    <LinearLayout 
        android:id="@id/reportContent" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:orientation="vertical" 
        android:layout_weight="1"
        android:padding="10dp"
        android:background="@color/bg_color">
            <TextView android:id="@+id/garbageTypeTextView" 
                android:layout_height="wrap_content" 
                android:textColor="@color/text" 
                android:layout_width="fill_parent" 
                android:text="@string/garbageTypeString" 
                android:textStyle="bold"/>
            <Spinner android:id="@+id/garbageTypeSpinner"
                android:layout_height="wrap_content" 
                android:layout_width="fill_parent"/>
            <TextView android:id="@+id/textViewForDateTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:text="@string/dateString"
                android:textColor="@color/text" 
                android:textStyle="bold" />
            <TextView android:id="@+id/dateTextView"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:textColor="@color/text" />
            <TextView android:id="@+id/textViewForAddressTitle"
                android:layout_height="wrap_content" 
                android:layout_width="wrap_content" 
                android:text="@string/addressString"
                android:textColor="@color/text" 
                android:textStyle="bold" />
            <TextView android:id="@+id/addressTextView"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:textColor="@color/text" />
            <TextView  android:id="@+id/textViewForPositionTitle"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content" 
                android:text="@string/positionString"
                android:textColor="@color/text" 
                android:textStyle="bold" />
            <TextView android:id="@+id/positionTextView"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:textColor="@color/text" />
            <TextView android:id="@+id/textViewForCommentTitle"
                android:layout_height="wrap_content" 
                android:layout_width="wrap_content" 
                android:text="@string/commentString"
                android:textColor="@color/text" 
                android:textStyle="bold" />
            <EditText android:id="@+id/commentTextBox"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent" 
                android:layout_weight="1"/>
            <Button android:id="@+id/sendCrapportButton" 
                android:onClick="sendCrapport"
                android:layout_height="wrap_content" 
                android:layout_width="fill_parent"
                android:text="Skicka rapport" />

    </LinearLayout>
        <Button android:id="@id/reportSlideButton"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:text=">"/>
</SlidingDrawer>

Adding components:

protected void addComponents() {
    takePictureButton = (ImageButton) findViewById(R.id.takePictureButton);
    slidingDrawer = (SlidingDrawer) findViewById(R.id.drawer);
}
Dees answered 22/3, 2011 at 15:7 Comment(0)
A
45

you could add android:clickable="true" to your slider content tag (id reportContent). that way it won't "click through". your buttons inside the slider should still work.. i hope ;)

Abracadabra answered 28/3, 2011 at 16:49 Comment(2)
If you include a layout from a different file (like I do), you have to put the android:clickable="true"'' in the included layout file, not in the include tag. Let me rather use an example:Joinery
yap, this did it. My case: sliding drawer over a recyclerview. Use <drawer_name>.setclickable(<true or false>); to enable or disable the view underneath.Ashlynashman
J
13

Just adding to @f-horn 's answer:

If you include a layout from a different file (like I do) for the SlidingDrawer, you have to put the 'android:clickable="true"' in the included layout file, not in the include tag. Let me rather use an example:

This will not work:

main.xml

<SlidingDrawer  android:handle="@+id/handle"
       android:content="@+id/content">

        <ImageView android:id="@id/handle" />
        <include android:id="@+id/content" layout="@layout/some_other_layout" 
        android:clickable="true"/>
</SlidingDrawer>'

This will:

main.xml

<SlidingDrawer  android:handle="@+id/handle"
        android:content="@+id/content">

        <ImageView android:id="@id/handle" />
        <include android:id="@+id/content" layout="@layout/some_other_layout"/>
</SlidingDrawer>'

some_other_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:clickable="true"> ............
<LinearLayout/>
Joinery answered 2/10, 2011 at 14:1 Comment(0)
J
2

I think you should add a touch listener on slider and return true on it. In that way, you will tell to the system that the touch event has been consumed.

Jeanne answered 22/3, 2011 at 15:12 Comment(2)
Thanks for your reply. See my comment on the answer below if you can.Dees
after you got a reference to slider, add on your onCreate() method: slider.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { return true; } });Jeanne
S
2

hey i stuck with this error for days so there is the simple answer

you've already created in your class the slidingdrawer whatever; just implement in your class , OnDrawerOpenListener,onDrawerCloseListener

then let the class add the unimplemented methods and go to the ondraweropenlistener{ slidingdrawer.setclickable(true); }

and in the drawercloselistener{ slidingdrawer.setclickable(false); }

this will set when the drawer is opened will make it clickable and prevent clicking in the behind view and when it closes every thing get back to default

this is the simplest solution try it :D

Sunfast answered 17/10, 2012 at 18:4 Comment(0)
S
1

I was having the same problem. My items in the sliding drawer weren't able to gain focus. After trying several different things, I discovered that I had a placed in the sliding drawer between the tag and the Linear Layout that had the contentLayout.

Once I removed it everything work fine.

<SlidingDrawer ....>
    <FrameLayout android:id="@+id/slideHandle" ... />

        **MOVED** <ScrollView> **TO**
    <LinearLayout android:id="@+id/contentLayout" ... >
        <ScrollView> **HERE**

I hope this helps someone.

Sunup answered 21/7, 2011 at 21:5 Comment(0)
T
0

On your SlidingDrawer, override onTouch(View v, MotionEvent event) and return true.

The one thing I am uncertain about is whether the framework will consider the drawer to overlay the View even when it is closed. If that is the case, then you should add some checks to see the state of the drawer, returning isOpened(), which will be true when the drawer is opened but false when it is closed.

Tumefaction answered 22/3, 2011 at 15:15 Comment(2)
My problem is that I don't know how to call a method on my SlidingDrawer, as I have no such method as far as I can tell in my Report.java class. Can you elaborate a little on how this would be implemented? Would I write the onTouch method in the Report.java class, and pass a view that would be owned by the SlidingDrawer or something along those lines?Dees
Added the component to the program now, but the question is how I can override the onTouch-method when I instantiate the SlidingDrawer using the findViewById.Dees
J
0
This is My main layout and where i introduce sliding drawer inside this. 

 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/Beige"
    android:clickable="true"
    android:orientation="vertical" >

    <Button
    android:id="@+id/DoneStart"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:textSize="14sp" />

    <SlidingDrawer
    android:id="@+id/SlidingDrawer"
    android:layout_width="wrap_content"
    android:layout_height="100dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:content="@+id/contentLayout"
    android:handle="@+id/handle_image"
    android:padding="1dp"
    android:rotation="180" >

    <LinearLayout
    android:id="@+id/contentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
    android:id="@+id/TextView01"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_weight="8"
    android:text="Hello Slider" />
    </LinearLayout>
    </SlidingDrawer>

Sample of mine after bit frustration where to add that android:clickable="true"

Jargonize answered 5/5, 2015 at 10:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.