Android Araç Çubuğu Farklı parçalar için Menü Öğeleri Ekleme


92

Araç çubuğum ve gezinme çekmecem var. Uygulamamı başlattığımda, araç çubuğu ve gezinme çekmecesi oluşturulur. Gezinme çekmecesinde öğelere tıkladığımda, yeni parçalar başlatıyor ve aynı araç çubuğunu koruyor. Belirli parçaları başlattığımda araç çubuğuna temelde arama, ekleme, düzenleme gibi menü öğelerini nasıl eklerim? Programın başlangıcında onları istemiyorum, dinamik olarak oluşturulmasını istiyorum. Ayrıca, bu düğmelere nasıl tıklayabilir ve diğer parçaları başlatmalarını sağlayabilirim. Bunu bir parça halinde istiyorum, araç çubuğundaki düzenleme düğmesi, başka bir bölümdeki düzenleme düğmesine kıyasla belirli bir şey yapar. Teşekkürler!

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"/>

Araç Çubuğu:

<?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"
/>

Yanıtlar:


172

Parçalarınıza benzer bir kod ekleyin:

@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);
}

Bu şekilde, parçalarınız için menüyü özelleştirebilirsiniz.


19
Bu doğru yanıttır, çünkü parçada çağrılan onCreateOptionsMenu yöntemi için setHasOptionsMenu (true) çağrısı gereklidir.
John Slavick

15
Arama konusunda hatırla menu.clear()içinde onCreateOptionsMenude aksi takdirde ebeveynden menüyü miras edeceğiz -.
Dart Dega

@DartDega kodu temizlemek için nereye koydum? Parça veya Etkinlik efendim,
parçamda

Bu, API seviyesi 28 ile çalışır mı? Hala ana faaliyetler menü öğelerini görüyorum
ArdenDev

33

Menü dinamik olarak nasıl oluşturulur: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Düzenlendi:

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()menü öğesi eylemlerini işlemek için kullanın . onOptionsItemSelected()bu durumda aranmaz.
Lahiru Chandima

2
verilen bağlantı artık yok
Ashvin solanki

28

Bunu yapmanın en iyi yolu:

1. Activity'de araç çubuğunu bulun ve supportActionBar olarak ayarlayın.

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

2. Daha sonra, aynı Aktivite üzerindeki farklı parçalar için seçenek menülerini ele almak çok kolay olacaktır. Her parçada aşağıdaki şeyleri istediğiniz gibi yapın:

OnCreateView Yöntemi çağrısında

setHasOptionsMenu(true);

Ve son olarak,

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

Ve menü öğelerini yönetmek için tıklayın, onOptionsItemSelected var:

@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 (true) gerçekten faydalıdır! Teşekkürler U
J.Dragon

11

En basit seçenek yapmaktır

toolbar.inflateMenu(R.menu.fragment_menu);

ve menü öğesine tıklamak için

toolbar.setOnMenuItemClickListener {
    when (it.itemId) {
        R.id.nav_example -> doThat()
    }
    true
}

Bu şekilde şişirilmiş menü için clickListener: stackoverflow.com/a/26512114/2098878
Rafael

10

onCreateOptionsMenuHer parçanızdaki yöntemi geçersiz kılın .

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

@JoeEigi Neden farklı bir araç çubuğu istiyorsunuz? Farklı başlık ve menüler ayarlayabilirsiniz.
Ellie Zou

@JoeEigi evet, xml özel menüsünü şişirerek özel menüye sahip olabilirsiniz. Çağrı setTitle()başlıkları ekleyebilir.
Ellie Zou

@JoeEigi Yanlış bağlama sahipmişsiniz gibi görünüyor, şuna bir göz atın: stackoverflow.com/questions/26998455/…
Allen Chan

1
Bildirimimde eylem çubuğunu kapattım, ancak yine de araç çubuğunun üzerindeki etkinlik düzenimde görünüyor. Bundan nasıl kurtulabilirim
Joe Eigi

Evet, bunu yaptım ve hala
düzenimde görünüyor

4

Bu sorunları doğru çözdüm. Benim çözümüm aşağıdaki kod gibi:

@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);
}

Evet, menüyü doğru gösterdim. Ama bu menüyü parça yakınında nasıl gizleyeceğimi kastediyorum, örneğin a -> b'den başka bir parçaya geçtiğimizde, b parçasının araç çubuğunda hala görünen a menüsü.
Zeeshan Ahmed

parçanın onCreateView'unda setHasOptionsMenu (false) kullanın b.
Kannan_SJD

4

Aynı sorunu yaşadım ve araç çubuğu menüsünü görüntülenen parçaya göre değiştirmek istedim.

Şu anda karşı karşıya olduğum sorun, menünün bir öncekine eklenmiş olmasıdır.

Yalnızca parçanın menüsünü göstermek için şunları öneririm:

@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);
}

Umarım yardımcı olur.


2
Sadece menüde olmadığını kontrol = null .Clear için çağırmadan önce ()!
mapo

2

Aşağıda, farklı parçalara sahip farklı menü seçeneklerini gösterme adımları verilmiştir.

Adım 1: setHasOptionsMenu'yu çağırın (true)

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

    }

Adım 2: Parça ile ilgili seçenek menü öğelerinizi şişirin.

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)
}

Bu, yeni
Im Batman

1

XML'in içine bu satırı ekleyin

app:menu="@menu/main_menu"

1
Aslında haklısın! Bunu xml ile ve ardından parçada belirtebilirsiniz: `` `` override fun onViewCreated (view: View, registeredInstanceState: Bundle?) {Super.onViewCreated (view, registeredInstanceState) toolBar.setNavigationOnClickListener {activity? .OnBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView olarak SearchView searchView.setOnQueryTextListener (this)} ``
user3193413

0

Yeni MaterialToolbar'ı kullanarak bir taşma menüsü oluşturmak ve aşağıdakileri kullanmak çok kolaydır:

<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"/>

ve sonra OnCLick Dinleyicileri ayarlamak için kodda şunu ekleyin:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.