2010-08-09 25 views
18

J'ai un ListView qui utilise différents fichiers XML pour créer des vues et créer des éléments. L'un de ces fichiers XML contient un RatingBar. Tout s'affiche et semble excellent.RatingBar onClick

J'essaie de joindre un gestionnaire onClick à la RatingBar pour lancer une nouvelle activité. Ma RatingBar est de style? Android: attr/ratingBarStyleSmall; donc c'est juste un indicateur (je veux que le petit RatingBar clique pour amener l'utilisateur à une activité où il peut faire différentes évaluations).

Mon problème est le gestionnaire onClick pour le RatingBar n'est jamais exécuté. Ce qui le rend plus intéressant, c'est que j'ai utilisé le même code pour faire un LinearLayout cliquable et ça marche bien. Quelqu'un pourrait-il me dire pourquoi?

getView de mon adaptateur regarde comme tel:

@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; 
} 
+0

Quelqu'un a-t-il des commentaires supplémentaires à ce sujet? Je n'arrive toujours pas à exécuter le gestionnaire onClick. Comme vous pouvez le voir, j'utilise le même code pour un LinearLayout et ça marche bien. Mon RatingBar est défini sur clickable. J'ai défini des points de rupture dans les écouteurs onClick pour LinearLayout et RatingBar et seul le gestionnaire LinearLayout est exécuté. Remarque: La RatingBar n'est PAS dans LinearLayout. Comme vous pouvez le voir, ils sont dans deux fichiers XML différents. – Andrew

Répondre

53

La raison de setOnClickListener() ne fonctionne pas est que RatingBaronTouchEvent() l'emporte (en fait sa super-classe, AbsSeekBar, fait) et ne jamais laisser View prendre soin de lui, donc View#performClick() est jamais appelé (ce qui aurait appelé le OnClickListener).

Deux solutions de contournement possibles:

    dérivent de RatingBar et redéfinissent à la place onTouchEvent()
    utilisation OnTouchListener, comme ceci:
     
    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; 
        } 
    

HTH, Jonas

1

Dans un ListView, vous avez généralement de décider si vous voulez que les éléments de la vue liste cliquable, ou un élément contenu dans le listview. Est-ce que r.isClickable() retourne vrai?

Vous pourriez avoir une meilleure chance de cliquer sur false sur la RatingBar, et en utilisant à la place onClickListener de listView pour gérer les événements click sur la ligne listView.

+0

Je ne souhaite pas que l'élément de liste soit cliquable dans son intégralité, mais je souhaite que les éléments individuels d'un élément de liste soient cliquables. Je l'ai déjà réalisé avec un article LinearLayout. Le code est exactement le même et le gestionnaire onClick s'exécute parfaitement. Je ne comprends pas pourquoi le RatingBar ne le fait pas. Je vais mettre à jour mon post principal pour refléter cela, 1 moment – Andrew

4

J'ai contourné ce problème en enveloppant le RatingBar dans un LinearLayout et en attachant un écouteur onClick au LinearLayout. Je n'aime pas faire ça, mais ça marche. Pour une raison mystérieuse onClick ne s'exécutera pas pour un RatingBar.

5

Andrew, vous pouvez juste essayer utiliser un autre événement disponible pour RatingB ar, OnRatingBarChangeListener. Voir cet exemple, ça marche pour moi!

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 

     @Override 
     public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 
      viewMarketDetails(mContext); 
      dialog.dismiss(); 
     } 
    }); 

Vous ne avez pas besoin d'utiliser le onClickEvent mais vous avez le même effet, mais seulement le travail, bien sûr, si vous changez réellement la valeur. (Si vous cliquez sur la valeur réelle, si n'a aucun effet)

4
ratingBar1.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 

     @Override 
     public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 

      String rateValue = String.valueOf(ratingbar1.getRating()); 
      System.out.println("Rate for Module is"+rateValue); 
     } 
    });