2012-11-05 24 views
12

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

public class MyApp extends FragmentActivity implements 
    FragmentTeams.FragmentNotification,ViewPager.OnPageChangeListener, 
     OnNavigationListener{ 

    ... 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 

    menuSearch = menu.findItem(R.id.menu_search); 
    mSearchView = new SearchView(this); 
    menuSearch.setActionView(mSearchView); 
    menuSearch.setVisible(false); 
    return true; 
} 

@Override 
public void onPageSelected(int pageNum) { 

if(pageNum== 1){  
    ActionBar actionBar = MyApp.this.getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);  
     menuSearch.setVisible(true); 
     invalidateOptionsMenu(); 

}else{   
    ActionBar actionBar = MyApp.this.getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
     menuSearch.setVisible(false); 
     invalidateOptionsMenu(); 
    } 
} 

ऊपर करता है (करने के लिए प्रकट करते हुए: मैं गतिविधि के लिए खोज आइकन को जोड़ने के लिए, और फिर बस छुपा या दिखा निर्भर करता है जिस पर viewpager पेज सक्रिय है, लेकिन निम्न काम नहीं कर रहा ओर से अब कर रहा हूँ) बना सकते हैं और onCreateOptionsMenu पर आइकन को छिपाने, यह पुन: सक्षम नहीं है जब

pageNum ==1 

में जाने किसी को भी मुझे ऐसा क्यों हो रहा हो सकता है के रूप में कुछ जानकारी दे सकते हैं?

उत्तर

22

invalidateOptionsMenu प्रणाली विधि onPrepareOptionsMenu कॉल करें, ताकि आप इस प्रकार इस विधि ओवरराइड कर सकते हैं:

public boolean onPrepareOptionsMenu(Menu menu) { 
     int pageNum = getCurrentPage(); 
     if (pageNum == 1) { 
     menu.findItem(R.id.menu_search).setVisible(true); 

     } 
     else { 
     menu.findItem(R.id.menu_search).setVisible(false); 
     } 
    } 

public void onPageSelected(int pageNum) { 
    invalidateOptionsMenu(); 
} 
+1

त्वरित प्रतिक्रिया के लिए धन्यवाद! यह सही ढंग से काम करता है। हालांकि, जब भी मैं किसी पृष्ठ पर स्वाइप करता हूं और मेनू आइटमों का प्रतिपादन करता हूं, तब भी थोड़ी देर में देरी होती है। मैं स्टॉक Google Apps का अध्ययन करके अनुसरण करने जा रहा हूं, ऐसा लगता है कि वे तुरंत प्रस्तुत करते हैं। – Josh

+1

यदि आप समर्थन लाइब्रेरी का उपयोग करते हैं तो इसके 'supportInvalidateOptionsMenu() ' – IronBlossom

+1

वैसे मैं getCurrentPage() विधि नहीं ढूंढ पा रहा हूं, क्या यह उपयोगकर्ता परिभाषित है या एंड्रॉइड स्वयं ही है? –

4

आप अपने टुकड़ा में onCreateOptionsMenu() को लागू करने और सेट कर सकते हैं 'setHasOptionsMenu (सही)' टुकड़ा

के लिए
+0

मैंने यह किया और यह कुछ उपकरणों पर काम करता है; लेकिन अन्य उपकरणों पर यह केवल तभी काम करता है जब आप अगले पृष्ठ पर जाते हैं और वापस जाते हैं (यह पहली बार काम नहीं करता है) – Roel

+0

यह अजीब है ... उन उपकरणों के विशिष्ट कार्यान्वयन में बग की तरह लगता है ... लानत निर्माता .. । – Boy

0

इस समस्या के लिए एक संभव समाधान अपने कस्टम मेनू बढ़ा-चढ़ाकर किया जाएगा अंदर गतिविधि अपने ViewPager होस्ट करता है और नीचे के रूप में एक मेनू संदर्भ हो रही:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.custom_menu, menu); 
    customMenu = menu; 
    return super.onCreateOptionsMenu(menu); 
} 

कि आप आसानी से छिपाने/नीचे के रूप में onPageSelected विधि के अंदर बिना किसी देरी के मेनू के आइटम दिखा सकते हैं के बाद:

@Override 
public void onPageSelected(int position) { 
    switch (position) { 
     case 0: { 
      customMenu.getItem(0).setVisible(false); 
      break; 
     } 
     case 1: { 
      customMenu.getItem(0).setVisible(true); 
      break; 
     } 
    }