2012-09-11 22 views
8

ठीक है, तो मुझे मिल गया है FavoritesList GalleryList विस्तार जो ListFragment लागू होता है:सूचीफ्रैगमेंट ऑनप्रेयरऑप्शनमेनू ने पहले सेक्रेट किया था। क्यों और कैसे ठीक/बाईपास?

public static class FavoritesList extends GalleryList { 

    public static FavoritesList newInstance(int page) { 
     FavoritesList list = new FavoritesList(); 

     Bundle args = new Bundle(); 
     args.putInt("page", page); 
     list.setArguments(args); 

     return list; 
    } 

    @Override 
    public void onCreate(Bundle saveInstanceState) { 
     super.onCreate(saveInstanceState); 

     Cursor cursor = dbHelper.getGalleries(fav, preferences.getString("sort"+fav, "date desc")); 
     listAdapter = new GalleryListAdapter(activity, cursor); 
     setListAdapter(listAdapter); 
    } 

    ... 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.add(Menu.NONE, 0, 8, "Remove All"); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     //listAdapter is null the first time this is called... 

     if (listAdapter != null && listlistAdapter.getCount() == 0) { 
      menu.findItem(R.id.filter).setEnabled(false); 
      menu.findItem(0).setEnabled(false); 
     } 
     else { 
      menu.findItem(R.id.filter).setEnabled(true); 
      menu.findItem(0).setEnabled(true); 
     } 
    } 
} 

यहाँ समस्या है: onPrepareOptionsMenu OnCreate (जहाँ मैं listAdapter प्रारंभ) जब यह टुकड़ा लोड हो रहा है, और यह प्रतिसाद नहीं से पहले कहा जाता है विकल्प मेनू को पहली बार दिखाया जाने से पहले टी फिर से बुलाया गया है! जब यह onPrepareOptionsMenu का दावा है

Fragment documentation बस गलत है "सही से पहले मेनू दिखाया गया है, हर बार यह दिखाया गया है कहा जाता है।"

पेज। मैं एंड्रॉइड सपोर्ट लाइब्रेरी (v4) का उपयोग कर रहा हूं। कोई विचार?

उत्तर

2

तो, के रूप में मूर्खतापूर्ण यह है के रूप में, यहाँ एक कार्य समाधान नहीं है:

public static class FavoritesList extends GalleryList { 

    Menu optionsMenu; 

    ... 

    @Override 
    public void onCreate(Bundle saveInstanceState) { 
     super.onCreate(saveInstanceState); 

     Cursor cursor = dbHelper.getGalleries(fav, preferences.getString("sort"+fav, "date desc")); 
     listAdapter = new GalleryListAdapter(activity, cursor); 
     setListAdapter(listAdapter); 

     if (optionsMenu != null) { 
      onPrepareOptionsMenu(optionsMenu); 
     } 
    } 

    ... 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     optionsMenu = menu; 

     if (listAdapter != null && listAdapter.getCount() == 0) { 
      menu.findItem(R.id.filter).setEnabled(false); 
      menu.findItem(0).setEnabled(false); 
     } 
     else { 
      menu.findItem(R.id.filter).setEnabled(true); 
      menu.findItem(0).setEnabled(true); 
     } 
    } 
} 

मूल रूप से मैं onPrepareOptionsMenu के पहले चलाने के दौरान विकल्प मेनू को पकड़ा है, तो इसे फिर से कहा जाता है एक बार listAdapter प्रारंभ किया गया है।

संपादित करें: जाहिर है कि विकल्पों के बिना जांच के बिना मेनू शून्य है, यह कुछ फोनों पर टूट जाएगा। मुझे एहसास होना चाहिए था।

2

अपने onCreate() पर invalidateOptionsMenu() पर कॉल करने का प्रयास करें। यह जांचना सुनिश्चित करें कि onPrepareOptionsMenu() पर आपकी सूची एडाप्टर null है या नहीं।

+0

अवैध ऑप्शनमेनू केवल एपीआई स्तर 11 से उपलब्ध है जबकि मेरा minSdkVersion 8 है। इसके अतिरिक्त, यह केवल क्रियाकलापों के लिए उपलब्ध नहीं है, न कि Fragments। –