2010-08-09 3 views
18

Ich habe eine ListView, die verschiedene XML-Dateien verwendet, um Ansichten zu erstellen und Elemente aus zu erstellen. Eine dieser XML-Dateien enthält eine RatingBar. Alles zeigt und sieht gut aus.RatingBar onClick

Ich versuche, einen onClick-Handler an die RatingBar anzuhängen, um eine neue Aktivität zu starten. Meine RatingBar ist von Stil? Android: attr/ratingBarStyleSmall; Es ist also nur ein Indikator (ich möchte, dass der kleine RatingBar-Klick den Benutzer zu einer Aktivität führt, wo er verschiedene Bewertungen vornehmen kann).

Mein Problem ist der OnClick-Handler für die RatingBar wird nie ausgeführt. Was es interessanter macht, ist, dass ich denselben Code verwendet habe, um ein LinearLayout klickbar zu machen, und es funktioniert gut. Kann mir jemand sagen warum?

Mein Adapters getView sieht aus, als solche:

@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

Hat jemand weitere Kommentare dazu? Ich kann den onClick-Handler immer noch nicht ausführen. Wie Sie sehen können, verwende ich den gleichen Code für ein LinearLayout und es funktioniert gut. Meine Bewertungsleiste ist auf anklickbar eingestellt. Ich habe Breakpoints innerhalb der onClick-Listener sowohl für LinearLayout als auch für die RatingBar gesetzt, und nur der LinearLayout -Handler wird ausgeführt. Hinweis: Die RatingBar befindet sich NICHT innerhalb des LinearLayout. Wie Sie sehen können, sind sie in zwei verschiedenen XML-Dateien. – Andrew

Antwort

53

Der Grund für setOnClickListener() nicht funktioniert ist, dass RatingBar überschreibt onTouchEvent() (eigentlich seine Superklasse, AbsSeekBar, der Fall ist) und nie View kümmern sich um sie lassen, so View#performClick() nie genannt wird (was die OnClickListener genannt hätte).

Zwei mögliche Abhilfen:

    stammen aus RatingBar und außer Kraft setzen onTouchEvent()
    Verwendung OnTouchListener statt, etwa 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; 
        } 
    

HTH, Jonas

1

In Listview, Sie müssen in der Regel entscheiden, ob Sie die Listenansicht Elemente anklickbar sein soll, oder ein Element in der Listview enthalten sind. Gibt r.isClickable() true zurück?

Möglicherweise haben Sie besser Glück klickbar auf false auf der RatingBar, und stattdessen mit onClickListener der listView, um mit den Klickereignissen in der listView Zeile umzugehen.

+0

Ich möchte nicht, dass das Listenelement in seiner Gesamtheit anklickbar ist, aber ich möchte, dass einzelne Elemente in einem Listenelement anklickbar sind. Das habe ich bereits mit einem LinearLayout-Element erreicht. Der Code ist genau derselbe und der onClick-Handler wird perfekt ausgeführt. Ich verstehe nicht, warum die RatingBar nicht funktioniert. Ich werde meinen Hauptbeitrag aktualisieren, um dies zu reflektieren, 1 Moment – Andrew

4

Ich habe dieses Problem gehackt, indem ich die RatingBar in ein LinearLayout gewickelt und einen onClick-Listener an das LinearLayout angehängt habe. Ich mag das nicht, aber es funktioniert. Aus irgendeinem mysteriösen Grund wird onClick nicht für eine RatingBar ausgeführt.

5

Andrew, können Sie nur versuchen, ein anderes Ereignis zu verwenden, das für RatingB verfügbar ist ar, OnRatingBarChangeListener. Sieh dieses Beispiel, es funktioniert für mich!

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 

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

So brauchen Sie nicht die onClickEvent zu verwenden, aber Sie haben die gleiche Wirkung, aber nur Arbeit, weg vom Kurs, wenn Sie tatsächlich den Wert zu ändern. (Wenn Sie auf den tatsächlichen Wert klicken, hat if keinen Effekt)

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); 
     } 
    });