2011-02-07 9 views
18

यह मैं पागल गाड़ी चला रहा है, क्योंकि यह कुछ मैं पहले किया है, लेकिन क्यों यह अब काम नहीं कर रहा को समझ नहीं सकता है ...एंड्रॉयड स्पिनर - onItemSelected/setOnItemSelectedListener को ट्रिगर नहीं

मैं एक मेनू मिल गया है बटन, menu.xml फ़ाइल के माध्यम से सामान्य तरीके से कार्यान्वित किया गया है और onOptionsItemSelected विधि में स्विच के साथ विधि है, जो स्पिनर बनाता है और प्रदर्शित करता है।

मैंने setOnItemSelectedListener जोड़ा है, लेकिन यह कभी भी ट्रिगर नहीं लगता है। स्पिनर दिखाई देता है, मैं एक विकल्प या बैक आउट चुनता हूं, न तो onItemSelected या onNothingSelected कहा जाता है।

मेनू-बटन-हैंडलिंग स्विच स्टेटमेंट के "केस" और "वापसी सत्य" के बीच सभी कोड यहां दिए गए हैं।

String[] widgetModes = {"Mode 1", "Mode2"}; 
ArrayAdapter<String> widgetModeAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, widgetModes); 
widgetModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

Spinner widgetModeSpinner = new Spinner(this); 
widgetModeSpinner.setAdapter(widgetModeAdapter); 
widgetModeSpinner.setPrompt("Choose Widget Mode"); 

widgetModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    { 
     Toast.makeText(topThis, "derp", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parentView) 
    { 
     Toast.makeText(topThis, "herf", Toast.LENGTH_LONG).show(); 
    } 
}); 

widgetModeSpinner.performClick(); 

कोई भी विचार - (अनुप्रयोग में अन्य सभी टोस्ट के लिए ठीक काम करता है topThis एक चर गतिविधि के संदर्भ की चर्चा करते हुए है)? मुझे अस्पष्टता से संदेह है कि तथ्य यह है कि मैं Spinner प्रोग्रामेटिक रूप से समस्या बना रहा हूं ...

+0

शायद parentView.getContext() का प्रयास करें? क्या आपको इसे यूआई में कहीं जोड़ने की ज़रूरत नहीं है? - इसका मतलब यह हो सकता है कि आइटम चयन जैसे UI इंटरैक्शन ईवेंट स्पिनर को पास नहीं हो रहे हैं। – Jems

+1

टिप के लिए धन्यवाद - उन पंक्तियों के साथ कुछ कार्यान्वित करना समाप्त हो गया। लेआउट में एक अदृश्य स्पिनर जोड़ा गया, निष्पादन को छोड़कर सब कुछ ले जाया गया मेनू विधि से बाहर निकलें और क्रिएट में कॉल किए गए एक में। यह सुनिश्चित करने के लिए लगता है कि श्रोता वर्तमान में फुलाए गए लेआउट, या कुछ ऐसे "संलग्न" है। SetContentView (R.layout.main) के संबंध में कोड की स्थिति; महत्वपूर्ण है ... – Greg

+1

मुझे लगता है कि मेरे बाकी कोड में कभी-कभी लेआउट को फिर से भरना शामिल होता है (setContentView (R.layout.main) का उपयोग करके;) समस्याएं भी पैदा करता है ... लेआउट के बाद फिर से सेट नहीं होने पर श्रोताओं को अब संलग्न नहीं किया जाता है reinflated। – Greg

उत्तर

6

याद रखें कि आप एक ही स्पिनर आइटम को फिर से चयन नहीं कर सकते हैं, यह हमेशा पहले आइटम को चयनित के रूप में सेट करता है यदि आप जोड़ नहीं रहे हैं स्पिनर चयन को संभालने के लिए कुछ कस्टम कोड।

के लिए टोस्ट नहीं दिखा रहा, मैं हमेशा इस तरह एक श्रोता इंटरफेस के अंदर एक टोस्ट बनाते समय अपने संदर्भ के रूप में "MyActivity.this" का उपयोग करने का सुझाव देते हैं:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     /** 
     * Called when a new item is selected (in the Spinner) 
     */ 
     public void onItemSelected(AdapterView<?> parent, View view, 
        int pos, long id) { 
       // An spinnerItem was selected. You can retrieve the selected item using 
       // parent.getItemAtPosition(pos) 

       Toast.makeText(MyActivity.this, "Hello Toast",Toast.LENGTH_SHORT).show(); 

      } 

      public void onNothingSelected(AdapterView<?> parent) { 
       // Do nothing, just another required interface callback 
      } 

    }); // (optional) 

और .show() अंत में कभी कभी भूल जाते हैं करने के लिए आसान है,)

14

मैं इसी तरह की समस्या थी जब मैं एक स्पिनर को लागू किया गया था, मैं उसे अपने जनक देखें हो रही द्वारा हल और सेट Adapter-

spinner1 =(Spinner)findViewById(R.id.spinner1); 
spinner1.setAdapter(BindSpinner("ProgramMaster",cols,null,true,"")); 
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
protected Adapter initializedAdapter=null; 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    { 
     if(initializedAdapter !=parentView.getAdapter()) { 
      initializedAdapter = parentView.getAdapter(); 
      return; 
     } 

     String selected = parentView.getItemAtPosition(position).toString(); 

     if(abc.equals("Select") && !selected.equals("Select")) 
     { 
      do something 
     } 

     else 
     { 
      Do something 
     } 
     textQualification=selected; 
     SearchUpdated("Qualification"); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parentView) { 
     // your code here 
    } 
}); 
2

मैं जानता हूँ कि प्रश्न थोड़ा पुराना है, लेकिन मामले में आप एक AsyncTask कॉलबैक के लिए इंतजार कर रहे हैं, सुनिश्चित करें कि आप कॉलबैक धागे पर notifyDataSetChanged() कॉल करके डेटा परिवर्तन के अपने एडाप्टर पता है बनाते हैं!

@Override 
public void onPostExecute(String result) { 
    ///do something with your data 
    spinnerArrayAdapter.notifyDataSetChanged(); 
} 
+0

धन्यवाद। इसके लिए 2 घंटे के लिए खुदाई कर रहे थे :) –

4

वास्तव में, अपने स्पिनर दृश्यता पर सेट है चला गया है जब आप performclick() विधि कॉल लेकिन इसके setOnItemSelectedListener ट्रिगर नहीं करेगा तो यह इसके बारे में क्लिक ट्रिगर किया जाएगा ताकि आप की जरूरत है दृश्यता बदलें, यह काम करेगा

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