2013-04-02 27 views
6

मेरे पास दो स्पिनर हैं जो मैं पारस्परिक रूप से अनन्य अर्थ में एक दूसरे से "बंधे" होना चाहता हूं: यदि आप एक आइटम का चयन करते हैं, तो उस आइटम का टेक्स्ट लाल हो जाता है और शीर्ष पर दिखाई देता है, जबकि दूसरा प्रारंभिक ("शीर्षक") चयन (यदि कोई अन्य आइटम पहले चुना गया था) प्रदर्शित करने के लिए वापस चला जाता है, और इसका पाठ सफेद हो जाता है।दो स्पिनर "सिंक्रनाइज़िंग"

यह सब onItemSelected श्रोताओं के माध्यम से किया जाता है: "इस मुद्दे को स्पिनर के लिए"

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View arg1, 
       int position, long arg3) {    
      issueSpin.setSelection(0);          
      ((TextView) issueSpin.getChildAt(0)).setTextColor(Color.parseColor("#FFFFFF")); 
      ((TextView) arg1).setTextColor(Color.parseColor("#E3170D")); 
.... 

और इसके विपरीत। मेरी समस्या यह है कि, यदि मैं एक स्पिनर से दूसरी तरफ जा रहा हूं और मैं शीर्ष आइटम का चयन करता हूं, तो ITemSlectedListener पंजीकृत नहीं होता है क्योंकि आइटम का चयन पहले ही चुना जा चुका है।

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

मैं कुछ के बारे में कुछ सवाल है कि मैं विचार कर रहा हूँ है:

  1. वहाँ जबकि अभी भी उनमें से एक को प्रदर्शित करने, अचयनित के रूप में एक स्पिनर में सभी आइटम स्थापित करने के लिए कोई तरीका है?
  2. क्या मैं onItemSelectedListener के संयोजन के साथ, संभवतः शीर्ष आइटम पर, एक अलग प्रकार की घटना का उपयोग कर सकता हूं (यानी 'सेटऑन टच लिस्टनर', 'सेटऑनक्लिक लिस्टनर', आदि)?
  3. क्या मुझे onItemSelectedListener के बिना स्पिनर में स्वयं के दृश्यों पर खुद को एक अलग प्रकार की घटना का उपयोग करना चाहिए?
  4. क्या आप उपरोक्त बुलेटपॉइंट्स में बताए गए लोगों की तुलना में बेहतर रणनीति खोजने में मेरी सहायता कर सकते हैं?

उत्तर

1

Spinner का उपयोग करने के बजाय, Button का उपयोग करें जो दृष्टिहीन रूप से एक गैर-सक्रिय Spinner जैसा दिखता है। जब बटन क्लिक किया जाता है, तो एक कस्टम Dialog दिखाएं जिसमें ListView है। आप वर्तमान में कौन सी आइटम चुने गए हैं यह दिखाने के लिए आप setSelection विधि और/या Adapter के getView में स्थिति का उपयोग कर सकते हैं। ListView के OnItemClickListener को सूचित किया जाएगा कि आइटम को चुना गया था या नहीं, इस पर ध्यान दिए बिना कुछ क्लिक किया गया था।

जब आपको लगता है कि कौन सा आइटम क्लिक किया गया था, तो Dialog छुपाएं और इसके बटन Activity बटन को सूचित करें, ताकि यह आवश्यक होने पर Buttons दोनों अपडेट कर सके।

मैंने DialogFragments और DialogFragmentParent का उपयोग करके इस तरह कुछ वास्तव में समान रूप से लागू किया है और यह ठीक काम करता है।

+0

लेकिन यह ऐप के समग्र डिज़ाइन के लिए महत्वपूर्ण है कि मेनू एक स्पिनर की तरह खुलता है - यानी विकल्प ड्रॉप हो जाते हैं। – drewmoore

+0

@ ड्रममोर मैंने एक उत्तर दिया जो प्रश्न में वर्णित समस्या हल करता है। मैंने पहली बार 'स्पिनर' उप-वर्गीकरण माना और जिम्मेदार विधि को ओवरराइड किया (जहां यह स्पष्ट है कि 'चयनित आइटम चयनित है' पर क्लिक किया गया है, लेकिन यह संभव नहीं था, क्योंकि विधि निजी है। यदि आप किसी अन्य माध्यम का उपयोग करके इसे इतनी बुरी तरह से चाहते हैं तो आप एनीमेशन का अनुकरण कर सकते हैं। हालांकि, अगर मेरा उत्तर आपकी मदद नहीं करता है क्योंकि प्रश्नों के कारण कुछ खुलासा नहीं किया गया है, तो आपको अपना प्रश्न संपादित करना चाहिए। – Shade

1

, तो आप नीचे की तरह कुछ पर विचार है

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("sectionSpin"); 
    } 
} 

और के लिए एक दूसरे को

issueSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("issueSpin"); 
    } 
} 

और अब

private void updateView(String spinner){ 
    if (spinner.equals(sectionSpin)){ 
     //update spinner per requirement 

    } 
    else{ 
    //update spinner per requirement 
    } 

} 

तुम भी के लिए कुछ अतिरिक्त चर या पैरामीटर विचार कर सकते हैं अगर आइटम पहली बार चुना गया है या नहीं तो ट्रैक रखें।

+0

यह अभी भी ऑनइम सेलेक्टेड() श्रोता पर निर्भर करता है, जो उपयोगकर्ता को उस आइटम का चयन करता है जो पहले से ही शीर्ष पर है। – drewmoore

0

तो, आप स्पिनरों में पहला आइटम "[एक चुनें]" या "[शीर्षक चुनें]" जैसे वैध चयन नहीं कर सकते हैं, श्रोता को हर बार आग लगाना पड़ता है।

इसमें अतिरिक्त लाभ होगा जो आपको पता चलेगा कि उपयोगकर्ता ने अगले चरण से पहले कुछ चुना है।

बेशक, यह वांछित आवेदन प्रवाह पर निर्भर करेगा।

संबंधित मुद्दे