android - फ्रैगमेंट में एंड्रॉइड विकल्प मेनू




android-fragments android-optionsmenu (12)

मैं टुकड़ों के समूह से विकल्प मेनू में एक आइटम जोड़ने की कोशिश कर रहा हूं।

मैंने एक नया MenuFragment क्लास बनाया है और इसे उन टुकड़ों के लिए बढ़ाया है जिनमें मैं मेनू आइटम शामिल करना चाहता हूं। यहां कोड है:

public class MenuFragment extends Fragment {

    MenuItem fav;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

किसी कारण से onCreateOptionsMenu चलाने के लिए प्रतीत होता है।


अपने मेनू फ़ोल्डर में एक .menu xml फ़ाइल बनाएं और यह xml जोड़ें

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    android:title="@string/action_search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView" />

आपके टुकड़े वर्ग में इस विधि को ओवरराइड करें और

implement SearchView.OnQueryTextListener    in your fragment class



@Override
 public void onViewCreated(View view, Bundle savedInstanceState) {    
  super.onViewCreated(view, savedInstanceState);
  setHasOptionsMenu(true);

}

अब बस खंड मेनू में अपनी मेनू xml फ़ाइल सेटअप करें

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_main, menu);

    final MenuItem item = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView)    
    MenuItemCompat.getActionView(item);


    MenuItemCompat.setOnActionExpandListener(item,
            new MenuItemCompat.OnActionExpandListener() {
                @Override
                public boolean onMenuItemActionCollapse(MenuItem item) {
                    // Do something when collapsed

                    return true; // Return true to collapse action view
                }

                @Override
                public boolean onMenuItemActionExpand(MenuItem item) {
                    // Do something when expanded
                    return true; // Return true to expand action view
                }
            });

}

आपका कोड ठीक है। विधि में केवल सुपर गायब था:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO add your menu : 
    inflater.inflate(R.menu.my_menu, menu);
    //TODO call super
    super.onCreateOptionsMenu(menu, inflater);
}

एक बात मैं इसमें जोड़ूंगा और कारण यह मेरे लिए काम नहीं कर रहा था।

यह नेपस्टर के जवाब के समान है।

  1. सुनिश्चित करें कि आपके टुकड़े की होस्टिंग गतिविधि AppCompatActivity बढ़ाती है, न कि FragmentActivity !

    public class MainActivity extends AppCompatActivity {
    
    }
    

    FragmentActivity के लिए Google संदर्भ Documentation से:

    नोट: यदि आप एक एक्शन बार को शामिल करने वाली गतिविधि को कार्यान्वित करना चाहते हैं, तो आपको इसके बजाय एक्शनबार एक्टिविटी क्लास का उपयोग करना चाहिए, जो इस का सबक्लास है, इसलिए आपको एपीआई लेवल 7 और उच्चतर पर फ्रैगमेंट एपीआई का उपयोग करने की अनुमति मिलती है।

  2. नेपस्टर के जवाब को अपडेट करने के लिए - ActionBarActivity अब बहिष्कृत किया जा रहा है, इसके बजाए AppCompatActivity उपयोग करें।

  3. AppCompatActivity का उपयोग करते समय, यह भी सुनिश्चित करें कि आप "थीम थीम को Theme.AppCompat या इसी तरह की थीम" (Google डॉक) पर सेट करें।

नोट: android.support.v7.app.AppCompatActivity android.support.v4.app.FragmentActivity क्लास का उप-वर्ग है ( AppCompatActivity Ref doc देखें)।


खंड दृश्य बनाने के बाद विकल्प मेनू सेट करना मेरे लिए अच्छा काम करता है।

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);        
}

मुझे एक ही समस्या है, मेरे टुकड़े एक ViewPager के पृष्ठ थे। ऐसा होने का कारण यह है कि मैं FragmentPagerAdapter को तुरंत चालू करते समय गतिविधि समर्थन खंड प्रबंधक के बजाय बाल खंड प्रबंधक का उपयोग कर रहा था।


मेनू को बढ़ाने से पहले आपको menu.clear () का उपयोग करने की आवश्यकता है।

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.clear();
        inflater.inflate(R.menu.menu, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

तथा

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

मेरी समस्या थोड़ा अलग थी। मैंने सब ठीक किया। लेकिन मैं टुकड़े की मेजबानी की गतिविधि के लिए गलत वर्ग विरासत में था।

तो स्पष्ट होने के लिए, यदि आप टुकड़े में onCreateOptionsMenu(Menu menu, MenuInflater inflater) ओवरराइड कर रहे हैं, तो सुनिश्चित करें कि इस गतिविधि को होस्ट करने वाली आपकी गतिविधि कक्षा android.support.v7.app.ActionBarActivity (यदि आप नीचे API का समर्थन करना चाहते हैं स्तर 11)।

मैं 11 से नीचे एपीआई स्तर का समर्थन करने के लिए android.support.v4.app.FragmentActivity विरासत में था।


मेरे मामले में, मुझे एक विशिष्ट टुकड़े के अंदर एक webview रीफ्रेश करने के लिए एक मेनू की आवश्यकता थी, जिसके लिए मैंने उपयोग किया था:

टुकड़ा :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    // TODO Add your menu entries here
    inflater.inflate(R.menu.menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.exit:
        System.exit(1);
        break;

    case R.id.refresh:
        webView.reload();
        break;
    }
    return true;

}

फ़ाइल menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/exit" android:title="Exit" android:icon="@drawable/ic_action_cancel" />
    <item android:id="@+id/refresh" android:title="Refresh" android:icon="@drawable/ic_action_refresh" />
</menu>

मैं पागल हो रहा था क्योंकि यहां कोई जवाब मेरे लिए काम नहीं करता था।

मेनू दिखाने के लिए मुझे कॉल करना था: setSupportActionBar(toolbar)

किया हुआ!

नोट: यदि आपका toolbar दृश्य एक ही गतिविधि लेआउट में नहीं है, तो आप सीधे अपनी गतिविधि कक्षा से ऊपर दिए गए कॉल का उपयोग नहीं कर सकते हैं, इस मामले में आपको उस गतिविधि को अपने खंड वर्ग से प्राप्त करने की आवश्यकता होगी और फिर setSupportActionBar(toolbar) । याद रखना: आपकी गतिविधि कक्षा को AppCompatActivity को विस्तारित करना चाहिए।

उम्मीद है कि यह जवाब आपकी मदद करेगा।


यदि आप अपना मेनू कस्टम जोड़ना चाहते हैं

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_custom, menu);
}

यदि उपर्युक्त सभी काम नहीं करते हैं, तो आपको डीबग करने और सुनिश्चित करने की आवश्यकता है कि क्रिएटऑप्शनमेनू पर कॉल किया गया है (डीबग डालने या लॉग लिखकर ...)

यदि यह नहीं चल रहा है, तो शायद आपका एंड्रॉइड थीम एक्शन बार का समर्थन नहीं कर रहा है। AndroidManifest.xml खोलें और एंड्रॉइड के लिए मान सेट करें android:theme थीम समर्थन एक्शन बार के साथ थीम :

 <activity
     android:name=".MainActivity"
     android:label="@string/app_name"
     android:theme="@style/Theme.AppCompat">

सुपर विधि को कॉल करें:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO Add your menu entries here
    super.onCreateOptionsMenu(menu, inflater);
}

कोड में लॉग स्टेटमेंट्स को यह देखने के लिए रखें कि विधि को कॉल नहीं किया जा रहा है या यदि मेनू को आपके कोड द्वारा संशोधित नहीं किया जा रहा है।

यह भी सुनिश्चित करें कि आप विकल्प मेनू हैंडलिंग में भाग लेने वाले टुकड़े को सूचित करने के लिए SetHasOptionsMenu कॉल कर रहे हैं।





android-optionsmenu