2012-03-01 13 views
11

मैं एंड्रॉयड 3+एंड्रॉयड कार्रवाई बार onNavigationItemSelected

के लिए विकसित कर रहा हूँ मेरी कार्रवाई बार में मैं एक ड्रॉपडाउन सूची (लटकती मैं इरादा के लिए how to hide/unhide the actionbar list on android 3? देखें)। समस्या यह है कि जब उपयोगकर्ता कुछ चुनता है तो मुझे एक निश्चित कार्रवाई करने की आवश्यकता होती है, लेकिन एंड्रॉइड ने नेविगेशन इटैम सेलेक्टेड() को कॉल के रूप में देखा है, इसलिए कोई चयन वास्तव में नहीं हुआ है।

उपयोगकर्ता कैसे वास्तव में कुछ दबाएगा और यह एंड्रॉइड से नकली कॉल नहीं है, तो मैं कैसे पता लगा सकता हूं?

public class ListDittaListener implements OnNavigationListener{ 

    private BaseActivity activity; 

    private ListDittaListener() 
    { 

    } 

    public ListDittaListener(BaseActivity activity) 
    { 
     this.activity = activity; 
    } 

    @Override 
    public boolean onNavigationItemSelected(int itemPosition, long itemId) 
    { 
     MyApp appState = ((MyApp)this.activity.getApplicationContext()); 
     appState.setDittaSelezionata((int) itemId); 

     SharedPreferences settings = this.activity.getSharedPreferences(MyApp.PREFS_NAME, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putInt("ditta_id_selezionata", (int) itemId); 

      ////////restart activity this.activity.recreate(); 

     return false; 
    } 

} 

उत्तर

16

आप आसानी से बस onNavigationItemSelected करने के लिए पहली कॉल करता है, तो आप की तरह अनदेखा कर सकते हैं:

public class Whatever implements OnNavigationListener { 
    private boolean synthetic = true; 

    @Override 
    public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
     if (synthetic) { 
      synthetic = false; 
      return true; 
     } 

     // do whatever you really wanted here 
    } 
} 
+1

धन्यवाद लेकिन जैसा कि मैंने बक्षीस विवरण में लिखा था, "मैं चाहूंगा काउंटर का उपयोग करने से पहले और पहली कॉल को अनदेखा करने से बचें ", यह एक हैक की तरह दिखता है, मैं समझना चाहता हूं कि यह पहली जगह क्यों खुश है – max4ever

+3

मेरे पास एक ही समस्या है और इसे इस तरह से हैक करने के लिए बहुत परेशान है। क्या इस तरह के व्यवहार का कोई उद्देश्य है? –

+0

मैंने इस समाधान का उपयोग फ्रैगमेंट को दो बार फिर से बनाया जाने से रोकने के लिए किया था जब स्क्रीन अभिविन्यास बदलता है और उनके राज्य को खो देता है। [यहां] देखें (http://stackoverflow.com/a/14295474/963396)। –

0

ठीक है, मैं आपके वर्तमान कोड में कुछ भी गलत नहीं देख सकता।

आपने अपने ड्रॉपडाउन तत्व कैसे बनाए हैं। और दृश्य के निर्माण के बाद एंड्रॉइड द्वारा "चयन" का कौन सा तत्व है। और आपके ऑनक्रेट विधि में आपका क्या कर रहा है जहां एक्शनबार शुरू किया गया है।

मैं के रूप में यहाँ के निर्देश दिए यह किया और यह मेरे लिए काम किया: http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

+0

यह ड्रॉपडाउन तत्व का पहला आइटम "चयन करता है" पर, मैं आमतौर पर अन्य लिंक किए गए प्रश्न (मूल रूप से केवल action_bar.setNavigationMode और action_bar.setListNavigationCallbacks) से कोड को कॉल करता हूं – max4ever

+0

एमएचएच दृश्य के आधार पर आप सबकुछ सही कर रहे हैं। क्या आप अपनी स्क्रीन घूर्णन कर रहे हैं? मुझे यहां एक समान समस्या मिली: http: // stackoverflow।कॉम/प्रश्न/903 9 045/कैसे-टू-सेट-एक्टिव-आइटम-इन-द-एक्शन-बार-ड्रॉप-डाउन-नेविगेशन – Moritz

+0

नल स्क्रीन घूर्णन नहीं – max4ever

2

एंड्रॉयड प्रणाली onNavigationItemSelected फोन करेगा (0, 0) गतिविधि सेटअप के बाद। (जिसका मतलब है बाद में रेज़्यूम())।

जैसा कि अन्य लोगों ने उल्लेख किया है, आप पहले कॉल को अनदेखा करने की तरह किसी भी हैक को बेहतर नहीं करेंगे, अन्यथा जब आप पहली अनुक्रमणिका का चयन करते हैं तो एंड्रॉइड सिस्टम नेविगेशन इटैम चयन() को फिर से कॉल नहीं किया जाएगा। (सिस्टम ने सोचा था कि पहला आइटम पहले से ही चुना गया है)

मेरा समाधान एक्शनबार सेट अप करने के बाद action actionbar.setSelectedNavigationItem (असली आइटम # आप चाहते हैं) को कॉल करें। फिर सिस्टम दो बार NavigationItem चयनित() पर कॉल करेगा। सबसे पहले NavigationItem चयनित (0, 0) और फिर ऑनविगेशन Item चयनित (असली आइटम #)।

+0

के साथ कोई दूसरा कॉल नहीं है, पहले आपने कहा है, पहले कॉल को अनदेखा करना बेहतर नहीं है, लेकिन जब आप 'NavigationItemSlected (0, 0)' कहलाते हैं तो आप क्या करते हैं? – skywall

0

मैं टुकड़े के साथ viewpager है और मैं केवल तभी, पेजर में हर टुकड़ा के लिए निर्धारित कस्टम क्रिया बार इच्छित पृष्ठ मैं नेविगेशन सूची, टुकड़ा आग स्वचालित रूप से onNavigationItemSelected जब मैं पृष्ठों की ओर स्वाइप करें में की जरूरत है इस व्यवहार से बचना चाहते हैं और चलाने के कार्यों मैं मैन्युअल रूप से चयनित एनवी आइटम।

public class MyFragment extends Fragment implements ActionBar.OnNavigationListener { 

    private boolead fireReady = false; 

    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 

     // every time make it false, this method invoked on swipe action 
     fireReady = false; 

     if (isVisibleToUser) { 
      // setup actionbar, you also can setup action bar in activity 
      String[] array = getActivity().getResources().getStringArray(R.array.users_order); 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, array); 
      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

      getActivity().getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
      getActivity().getActionBar().setListNavigationCallbacks(adapter, this); 
     } 

    } 

    @Override 
    public boolean onNavigationItemSelected(int itemPosition, long itemId) { 

     if (fireReady) { 
      // task fire only when you directly press navigation item 
      UsersTask task = new UsersTask(getActivity()); 
      task.setTaskListener(this); 
      task.execute(usersUrls[itemPosition]); 
     } else { 
      // make it true first time when page displayed 
      fireReady = true; 
     } 
     return false; 
    } 

} 

} 
4

विधि onNavigationItemSelected(int itemPosition, long itemId) कार्रवाई बार से वैसे भी बुलाया जाएगा।

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

mActionBarMenuSpinnerAdapter = ...; 
mActionBar = getActionBar(); 
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
mActionBar.setListNavigationCallbacks(mActionBarMenuSpinnerAdapter, this); 
mActionBar.setSelectedNavigationItem(###your_default_navigation_item_here###); 

यह आप onNavigationItemSelected(int itemPosition, long itemId) में परिवर्तनों को लागू करने अगर केवल itemPosition अलग है द्वारा अपनी समस्या को हल कर सकते हैं करने के बाद: यहाँ कोड है।

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