2010-08-09 4 views
18

मेरे पास एक सूची दृश्य है जो दृश्य बनाने और वस्तुओं को बनाने के लिए विभिन्न XML फ़ाइलों का उपयोग करता है। इन एक्सएमएल फाइलों में से एक में रेटिंगबार है। सब कुछ प्रदर्शित करता है और उत्कृष्ट दिखता है।रेटिंगबार ऑनक्लिक

मैं एक नई गतिविधि लॉन्च करने के लिए रेटिंगबार पर ऑनक्लिक हैंडलर संलग्न करने का प्रयास कर रहा हूं। मेरा रेटिंगबार शैली का है? एंड्रॉइड: एटीआर/रेटिंगबार्स्टाइलसम; तो यह सिर्फ एक संकेतक है (मैं चाहता हूं कि छोटा रेटिंगबार उपयोगकर्ता को उस गतिविधि में ले जाने के लिए क्लिक करें जहां वे विभिन्न रेटिंग कर सकते हैं)।

मेरी समस्या रेटिंगबारी के लिए ऑनक्लिक हैंडलर है जिसे कभी निष्पादित नहीं किया जाता है। यह और अधिक रोचक बनाता है कि मैंने लाइनरलाइट को क्लिक करने योग्य बनाने के लिए एक ही कोड का उपयोग किया है और यह ठीक काम करता है। क्या कोई मुझे बता सकता है क्यों?

@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

किसी को भी इस पर कोई अतिरिक्त टिप्पणियां है? मैं अभी भी निष्पादित करने के लिए ऑनक्लिक हैंडलर नहीं प्राप्त कर सकता हूं। जैसा कि आप देख सकते हैं, मैं एक लाइनरलायआउट के लिए एक ही कोड का उपयोग कर रहा हूं और यह ठीक काम करता है। मेरा रेटिंगबार क्लिक करने योग्य पर सेट है। मैंने LinearLayout और RatingBar दोनों के लिए ऑनक्लिक श्रोताओं के अंदर ब्रेक पॉइंट सेट किए हैं और केवल लाइनरलाउट हैंडलर निष्पादित हो जाता है। नोट: RatingBar LinearLayout के अंदर नहीं है। जैसा कि आप देख सकते हैं, वे दो अलग-अलग एक्सएमएल फाइलों में हैं। – Andrew

उत्तर

53

के लिए setOnClickListener() काम नहीं कर कारण यह है कि RatingBar ओवरराइड onTouchEvent() (वास्तव में अपनी सुपर वर्ग, AbsSeekBar, करता है) और कभी नहीं करते हैं इसके बारे में View ले देखभाल, इसलिए View#performClick() कभी नहीं कहा जाता है (जो OnClickListener कहा जाता है |) है।

दो संभावित समाधानों:

    RatingBar से निकाले जाते हैं और बदले ओवरराइड onTouchEvent()
    उपयोग OnTouchListener, इसलिए जैसे:
     
    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, जोनास

1

एक ListView में, आप आम तौर पर अगर आप सूची दृश्य आइटम क्लिक करने योग्य होने के लिए चाहते तय करने के लिए है, या एक आइटम सूचीदृश्य के भीतर निहित:

मेरे एडाप्टर के getView जैसे लग रहा है। क्या r.isClickable() सच हो जाता है?

आपके पास रेटिंगबार पर झूठी पर क्लिक करने योग्य बेहतर किस्मत सेटिंग हो सकती है, और इसके बजाय सूची दृश्य पर क्लिक घटनाओं से निपटने के लिए सूची दृश्य पर क्लिक करें। दृश्य देखें।

+0

मैं नहीं चाहता कि सूची आइटम पूरी तरह से क्लिक करने योग्य हो, लेकिन मैं सूची आइटम के अंदर अलग-अलग आइटम क्लिक करने योग्य होना चाहता हूं। मैंने पहले से ही एक लीनियरआउट आइटम के साथ इसे हासिल कर लिया है। कोड बिल्कुल वही है और ऑनक्लिक हैंडलर पूरी तरह निष्पादित करता है। मुझे समझ में नहीं आता कि रेटिंगबैर क्यों नहीं करता है। मैं इसे प्रतिबिंबित करने के लिए अपना मुख्य पोस्ट अपडेट करूंगा, 1 पल – Andrew

4

मैंने लाइनरलायआउट में रेटिंगबार को लपेटकर और लाइनरलायआउट पर ऑनक्लिक श्रोता को अटैच करके इस समस्या को हल किया है। मुझे यह पसंद नहीं है, लेकिन यह काम करता है। ऑनक्लिक पर कुछ रहस्यमय कारणों के लिए रेटिंगबार के लिए निष्पादित नहीं किया जाएगा।

5

एंड्रयू, तो आप सिर्फ कोशिश कर सकते हैं रेटिंग बी के लिए उपलब्ध एक और कार्यक्रम का उपयोग करने के लिए आर, ऑनरेटिंगबैंचलिस्टर। यह उदाहरण देखें, यह मेरे लिए काम करता है!

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 

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

तो तुम onClickEvent उपयोग करने की आवश्यकता नहीं है, लेकिन आप, बेशक एक ही प्रभाव है, लेकिन केवल काम है, यदि आप वास्तव में मूल्य बदल जाते हैं। (आप, वास्तविक मूल्य पर क्लिक करते हैं, तो कोई प्रभाव नहीं है)

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