diadamalol
diadamalol

Reputation: 198

OnClickListener Layout detection

I've a custom button layout: Its a FrameLayout as a background with a normal Button in the center with an icon next to the text.

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
    android:id="@+id/framelayout"
    style="?android:attr/buttonStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_centerVertical="true"
    android:background="#F00">

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/buttonWithIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:background="@null"
        android:drawableStart="@android:drawable/ic_delete"
        android:gravity="center"
        android:textAllCaps="false"
        android:textColor="#FFF"/>
</FrameLayout>

I had an onClickListeners on the Button and I realized, clicks on the background (=FrameLayout) weren't detected. Because of this I want an onClickListener that detects clicks on the FrameLayout and also on the Button, without having two Listeners, that do the same.

I tried giving the RelativeLayout an ID, but the layout couldn't be found (=null).

Maybe my button layout isn't optimal. But I need a fullwidth button with a icon next to the text, without any spaces between the icon and the text.

The Icons gets set like this

button.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.ic_icon, 0, 0,0);

Thank you

Upvotes: 0

Views: 644

Answers (3)

MohanadMohie
MohanadMohie

Reputation: 1044

You can just add one OnClickListener to both views. That way, you only write your code once, and if you click either the FrameLayout or the Button that same code will run.

    final View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Add Your OnClick Code Here

        }
    };

    framelayout.setOnClickListener(mOnClickListener);
    buttonWithIcon.setOnClickListener(mOnClickListener);

Upvotes: 1

Lucas Queiroz Ribeiro
Lucas Queiroz Ribeiro

Reputation: 735

Create a function in your Activity with a View Argument, and in your layout, set the onClick to your two views.

Activity:

public void myAction(View v){
// Do what you want
}

Your Layout:

<FrameLayout
    android:id="@+id/framelayout"
    style="?android:attr/buttonStyle"
    android:onClick="myAction"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_centerVertical="true"
    android:background="#F00">

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/buttonWithIcon"
        android:onClick="myAction"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:background="@null"
        android:drawableStart="@android:drawable/ic_delete"
        android:gravity="center"
        android:textAllCaps="false"
        android:textColor="#FFF"/>
</FrameLayout>

Maybe adding in just the FrameLayout may dispatch the event in the button also, i can't test right now :)

Upvotes: 0

Asmaa Rashad
Asmaa Rashad

Reputation: 603

You can put all of your views that you want them to be clickable and remove all clickListeners of entire views.

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

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

<FrameLayout
    style="?android:attr/buttonStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_centerVertical="true"
    android:background="#F00">

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/buttonWithIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:background="@null"
        android:drawableStart="@android:drawable/ic_delete"
        android:gravity="center"
        android:textAllCaps="false"
        android:textColor="#FFF"/>
</FrameLayout>
</LinearLayout>

and add this clickListener to LinearLayout:

LinearLayout linearlayout=(linearLayout)findViewById(R.id.linearlayout);
 linearlayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Add Your Code Here
            }
        });

Upvotes: 0

Related Questions