एंड्रॉइड टूलबार विभिन्न टुकड़ों के लिए मेनू आइटम जोड़ना


89

मेरे पास टूलबार के साथ-साथ नेविगेशन ड्रावर भी है। जब मैं अपना ऐप शुरू करता हूं, तो टूलबार और नेविगेशन ड्रॉअर बनाए जाते हैं। जब मैं नेविगेशन ड्रॉअर में आइटम क्लिक करता हूं, तो यह नए टुकड़े शुरू करता है और समान टूलबार रखता है। जब मैं विशिष्ट टुकड़े शुरू करता हूं, तो मैं टूलबार में मेनू आइटम को मूल रूप से कैसे जोड़ूं, जोड़ूं, संपादित करूं? मैं उन्हें कार्यक्रम की शुरुआत में नहीं चाहता, लेकिन गतिशील रूप से बनाया गया। इसके अलावा, मैं इन बटनों को कैसे क्लिक कर पाऊंगा और उन्हें अन्य टुकड़े शुरू करने होंगे। मैं इसे एक टुकड़े में चाहता हूं, टूलबार में संपादित बटन किसी अन्य टुकड़े में संपादित बटन की तुलना में एक विशिष्ट काम करता है। धन्यवाद!

Menu_toolbar:

<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>

टूलबार:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>

जवाबों:


167

अपने टुकड़ों में समान कोड जोड़ें:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
    View v = inflater.inflate(R.layout.library_fragment, parent, false);
    setHasOptionsMenu(true);
    return v;
}


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

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


19
यह सही उत्तर है क्योंकि onCreateOptionsMenu विधि के लिए setHasOptionsMenu (ट्रू) के कॉल की आवश्यकता है।
बजे जॉन स्लाविक

15
बुला के बारे में याद menu.clear()में onCreateOptionsMenuअन्यथा आप माता पिता से मेनू के वारिस होगा, बहुत -।
डार्ट देवगा

@DartDega जहाँ मैं कोड साफ़ करने के लिए डालूँ? टुकड़ा या गतिविधि महोदय, मैं अपने टुकड़ा में MENUITEM नहीं दिखाई दे रहा
FamFamFam

क्या यह एपीआई स्तर 28 के साथ काम करता है? मैं अभी भी मुख्य गतिविधियाँ मेनू आइटम
देखता हूँ

33

यह मेनू को गतिशील रूप से बनाने का तरीका है: http://www.101apps.co.za/index.php/articles/use-toolbars-in-your-apps.html

संपादित:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);

4
actionBarToolbar.setOnMenuItemClickListener()मेनू आइटम क्रियाओं को संभालने के लिए उपयोग करें। onOptionsItemSelected()इस स्थिति में नहीं बुलाया जाता है।
लाहिरु चंदिमा

2
दिया गया लिंक नहीं है
अश्विन सोलंकी

25

इसे करने का सबसे अच्छा तरीका:

1. गतिविधि में टूलबार खोजें और इसे supportActionBar के रूप में सेट करें।

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

2. फिर यह एक ही गतिविधि पर विभिन्न टुकड़ों के लिए विकल्प मेनू को संभालने के लिए केक का एक टुकड़ा होगा। अपनी इच्छानुसार प्रत्येक टुकड़े में निम्नलिखित बातें करें:

OnCreateView मेथड कॉल में

setHasOptionsMenu(true);

और अंत में,

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

और मेनू आइटम पर क्लिक करने के लिए, हमारे पास onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}

1
setHasOptionsMenu (सच) वास्तव में उपयोगी है! धन्यवाद U
J.Dragon

10

onCreateOptionsMenuअपने हर टुकड़े में ओवरराइड विधि।

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

@JoeEigi आप अलग टूलबार क्यों चाहते हैं? आप विभिन्न शीर्षक और मेनू सेट कर सकते हैं।
ऐली ज़ो

@JoeEigi हाँ, आप कस्टम मेनू xml फुलाकर कस्टम मेनू कर सकते हैं कॉल setTitle()शीर्षक जोड़ सकते हैं।
ऐली ज़ो

@ जोइगी लगता है कि आपको गलत संदर्भ मिला है, इस पर एक नज़र डालें: stackoverflow.com/questions/26998455/…
एलन चान

1
मैंने अपने प्रदर्शन में एक्शनबार को बंद कर दिया, लेकिन फिर भी टूलबार के ऊपर मेरी गतिविधि लेआउट में दिखाई देती है। मैं इससे कैसे छुटकारा
पाऊंगा

हां, ऐसा किया और अभी भी मेरे लेआउट में दिखाई देता है लेकिन देखने से बाहर है
जो एगी


4

मैंने इस मुद्दे को सही ढंग से हल किया। मेरा समाधान निम्नलिखित कोड के रूप में है:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

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

हां मैंने मेनू को सही तरीके से दिखाया। लेकिन इस मेनू को खंड के करीब कैसे छिपाया जाए, मेरा मतलब है कि जब हम a -> b से किसी अन्य टुकड़े में स्विच करते हैं, तो खंड b के टूलबार में दिखाई देने वाला मेनू।
जीशान अहमद

खंड b के onCreateView में setHasOptionsMenu (झूठा) का उपयोग करें।
कन्नन_सजद

4

मेरे पास एक ही मुद्दा था और मैं प्रदर्शित टुकड़े के अनुसार टूलबार मेनू को बदलना चाहता था।

अब मुझे जो समस्या आ रही है, वह यह है कि मेनू को पिछले एक में जोड़ा गया है।

टुकड़े के लिए केवल मेनू दिखाने के लिए, मेरा सुझाव है:

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

आशा है कि यह मदद करेगा।


2
बस .clear को कॉल करने से पहले अशक्त मेनू अगर जाँच = ()!
mapo

2

नीचे अलग-अलग टुकड़ों के साथ अलग-अलग मेनू विकल्प दिखाने के चरण दिए गए हैं।

चरण 1: कॉल करें

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

Step2: अपने खंड से संबंधित विकल्प मेनू आइटम को फुलाएं।

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

इससे मुझे अनचाहे मेनू बटन को हटाने में मदद मिली जो मेरे नए मेनू पर दिखाई दिया
इम बैटमैन

1

XML के अंदर इस लाइन को जोड़ें

app:menu="@menu/main_menu"

1
वास्तव में तुम सही हो! आप इसे xml द्वारा और फिर टुकड़े में निर्दिष्ट कर सकते हैं: `` `ओवरराइड मज़ा onViewCreated (देखें: देखें, सहेजी गई सामग्री। बंडल:) toolBar.menu.findItem (R.id.action_search) .actView SearchView searchView.setOnQueryTextListener के रूप में (यह)} `` `
user3193413

0

नए MaterialToolbar का उपयोग करना अतिप्रवाह मेनू बनाना और इसके लिए उपयोग करना बहुत आसान है:

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

और फिर OnCLick श्रोताओं को सेट करने के लिए कोड में इसे जोड़ें:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.