2012-04-21 15 views
19

मैं रेडियोबटन में स्थित रेडियोबटन की प्रोग्रामेटिक जांच के मुद्दे से जूझ रहा हूं। ऐसा लगता है कि एक check() कॉल तीन घटनाओं को उठाता है - एक बार पहले रेडियोबटन के लिए और दूसरे के लिए दो बार, जो मेरा लक्ष्य है। साथ ही इंटरफ़ेस में दूसरे रेडियोबटन पर क्लिक करने से केवल एक ईवेंट दिखाई दे सकता है, जो सही है।रेडियो ग्रुप पर चेक किया गया चेक() तीन बार

तो, क्या कई घटनाओं को बढ़ाने से बचने का कोई तरीका है?

public class RadiogroupActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     RadioGroup r = (RadioGroup) findViewById(R.id.radioGroup1); 
     RadioButton b = (RadioButton) findViewById(R.id.radio1); 
     r.setOnCheckedChangeListener(onPromobuttonsClick); 
     r.check(R.id.radio1); 

    } 

    private OnCheckedChangeListener onPromobuttonsClick = new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      Log.d("x", "x"); 
     } 
    }; 
} 

उत्तर

39

तो, वहाँ एक रास्ता कई घटना को ऊपर उठाने से बचने के लिए है?

इसके बजाय b.setChecked(true); पर कॉल करें।


source code पर एक संक्षिप्त दृष्टि पुष्टि करता है कि RadioGroup#check() वास्तव में OnCheckChangedListener तीन बार फोन करता है ...

  1. जब वर्तमान चयन हटाया गया है,
  2. जब नए RadioButton चेक किया गया है, और
  3. जब रेडियो ग्रुप बचाता है जो रेडियोबटन अब चेक किया गया है।

विषम क्विर्क।

+0

महोदय: एक नज़र .Take आपकी मदद की जरूरत है कृपया http://stackoverflow.com/questions/22602559/how-do- कार्यान्वयन-इन-इन-एंड्रॉइड –

+1

वास्तव में मेरे जीवन को बचाया ... शानदार @ सैम –

+0

कृपया अधिक विस्तृत उत्तर दें। मुझे आपका जवाब नहीं मिल रहा है। –

2

onResume() विधि में बस अपनी r.setOnCheckedChangeListener(onPromobuttonsClick); लाइन पोस्ट करें। यह मेरे लिए काम करता है।

0

तो यह एक पुराना है लेकिन मुझे भी ऐसा ही व्यवहार मिला है। RadioGroup की check() विधि के बजाय RadioButton की toggle() विधि को कॉल करने के लिए मुझे मिली एक कार्यवाही थी।

तो इस उदाहरण में, आप बस b के बाद से

b.toggle(); 

साथ

r.check(R.id.radio1); 

स्वैप करने के लिए पहले से ही आईडी R.id.radio1 साथ दृश्य है की जरूरत है woulod।

0

मुझे यह समस्या थी जब मैं रेडियो बटन प्रेस के लिए एनालिटिक्स लॉग करना चाहता था, लेकिन जिस तरह से रेडियो समूह कॉल को .check() के साथ संभाला जा रहा था, onCheckedChangeListener को कई बार बुलाया गया (जिसने कई घटनाएं भेजीं)।

मैं इसे निम्नलिखित तरीके से हैंडल किया केवल एक प्रति क्लिक घटना प्राप्त करने के लिए:

// create listeners so we don't duplicate the creation in for loop 
View.OnClickListener onClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // whatever you want to do here 
    } 
}; 

// add on click listener to all radio buttons 
int buttonCount = buttonGroup.getChildCount(); 
for (int i = 0; i < buttonCount; i++) { 
    if (buttonGroup.getChildAt(i) instanceof RadioButton) { 
     buttonGroup.getChildAt(i).setOnClickListener(onClickListener); 
    } 
}