OnClickListener not starting for custom view

I created a custom button that is pumped from an XML layout. Everything is working fine, except that the click listener does not start.
I suspect that the problem is with the android:clickable="true" attribute, since when it is deleted, the click listener is triggered. But I need this attribute to be set, since my custom view uses the selector as the background, if I remove it then the selector will no longer work.

Here's the class definition:

 public class CustomButton extends LinearLayout{ public CustomButton(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.custom_button, this, true); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomButton, 0, 0); String titleStr = a.getString(R.styleable.CustomButton_title); String subTitleStr = a.getString(R.styleable.CustomButton_subTitle); int iconResId = a.getResourceId(R.styleable.CustomButton_icon, R.drawable.ic_launcher); a.recycle(); TextView title = (TextView)findViewById(R.id.title); title.setText(titleStr); TextView subTitle = (TextView)findViewById(R.id.subTitle); subTitle.setText(subTitleStr); ImageView icon = (ImageView)findViewById(R.id.icon); icon.setImageResource(iconResId); } } 

An XML layout from which the user view is inflated:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/white_box" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/main_button_selector" android:clickable="true" android:gravity="center" android:orientation="horizontal"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="icon" android:layout_marginLeft="5dip" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginRight="5dip" android:orientation="vertical"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/grey_text" android:textSize="@dimen/mainTextSize" android:textStyle="bold"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/subTitle" android:ellipsize="end" android:maxLines="2" android:textColor="@color/grey" android:textSize="@dimen/mainSubTextSize"/> </LinearLayout> </LinearLayout> </FrameLayout> 

And this is how I use it in XML layouts:

  <com.customviews.CustomButton android:id="@+id/pay" android:layout_weight="1" android:layout_width="0dip" android:layout_height="fill_parent" custom:title="Hello World" custom:subTitle="Subtitle" custom:icon="@drawable/ic_launcher"/> 

and how the click listener sets the action:

  CustomButton button = (CustomButton) findViewById(R.id.pay); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MyActivity.this, "Hello World!", Toast.LENGTH_LONG).show(); 

I have seen several threads already considering this issue, but none of them helped me. Would thank for any help.

+8
android
source share
1 answer

I was worried that setting android:clickable="true" would not setOnClickListener() selector background, but looking at the setOnClickListener() method from the View class, I saw that setClickable(true) called:

 public void setOnClickListener(OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; } 

So, removing android:clickable="true" from the layout declaration and setting only the listen button for my custom button solved the problem.

+11
source share

All Articles