Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RatingBar onClick

Tags:

I have a ListView that uses different XML files to create Views and make items out of. One of these XML files contains a RatingBar. Everything displays and looks excellent.

I'm trying to attach an onClick handler to the RatingBar to launch a new Activity. My RatingBar is of style ?android:attr/ratingBarStyleSmall; so it's just an indicator (I want the small RatingBar click to take the user to an Activity where they can do various ratings).

My problem is the onClick handler for the RatingBar never gets executed. What makes it more interesting is that I've used the same code to make a LinearLayout clickable and it works fine. Could anyone tell me why?

My Adapter's getView looks as such:

@Override public View getView(int position, View convertView, ViewGroup parent) {      int type = getItemViewType(position);      // get the View for this list item     View v = convertView;     if (v == null) {         LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);         switch (type) {             // ...             case TYPE_LOOKUP:                 v = vi.inflate(R.layout.layout_itemlist_itemlookup, parent, false);                 LinearLayout vLookup = (LinearLayout)v.findViewById(R.id.itemlist_lookup);                 if (vStore != null) {                     vStore.setOnClickListener(new View.OnClickListener() {                             public void onClick(View v) {                                 // THIS HANDLER WORKS FINE                                 Intent intentLaunchLookup = new Intent(ActivityItemList.this, ActivityLookup.class);                                 startActivity(intentLaunchLookup);                             }                         });                 }                 break;             case TYPE_SEPARATOR:                 v = vi.inflate(R.layout.layout_itemlist_itemseparator, parent, false);                 RatingBar r = (RatingBar)v.findViewById(R.id.itemlist_rating);                 if (r != null) {                     r.setOnClickListener(new View.OnClickListener() {                             public void onClick(View v) {                                 // THIS HANDLER DOES NOT GET EXECUTED (r IS NOT NULL; SO THIS SHOULD HAVE BEEN CREATED)                                 Intent intentLaunchRating = new Intent(ActivityItemList.this, ActivityRating.class);                                 startActivity(intentLaunchRating);                             }                         });                 }                 break;             // ...         }     }     // …    // return the created view     return v; } 
like image 392
Andrew Avatar asked Aug 09 '10 20:08

Andrew


1 Answers

The reason for setOnClickListener() not working is that RatingBar overrides onTouchEvent() (actually its super class, AbsSeekBar, does) and never let View take care of it, so View#performClick() is never called (which would have called the OnClickListener).

Two possible workarounds:

    derive from RatingBar and override onTouchEvent()
    use OnTouchListener instead, like so:
 ratingBar.setOnTouchListener(new OnTouchListener() {     @Override     public boolean onTouch(View v, MotionEvent event) {         if (event.getAction() == MotionEvent.ACTION_UP) {             // TODO perform your action here         }         return true;     } 

In Kotlin

ratingBar.setOnTouchListener(View.OnTouchListener { v, event ->                 if (event.action == MotionEvent.ACTION_UP) {                     // TODO perform your action here                 }                 return@OnTouchListener true             }) 

HTH, Jonas

like image 175
jonasb Avatar answered Sep 25 '22 08:09

jonasb