Android'de menü araç çubuğuna nasıl ayarlanır


99

Bunun ToolBaryerine kullanmak istiyorum ActionBar, ancak bana araç çubuğunda menüyü gösterme !!! Yenile veya Ayar düğmeleri gibi set menü istiyorum ActionBar.

görüntü açıklamasını buraya girin

Toolbar.xml kodu:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    app:navigationContentDescription="@string/abc_action_bar_up_description"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:title="Main Page"
    android:gravity="center"/>

MainPage.java kodu:

public class MainPage extends AppCompatActivity {
    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page);

        toolbar = (Toolbar) findViewById(R.id.main_toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("Main Page");
        }
        toolbar.setSubtitle("Test Subtitle");
        toolbar.inflateMenu(R.menu.main_manu);
    }
}

main_menu.xml kodu:

<?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/menu_main_setting"
        android:icon="@drawable/ic_settings"
        android:orderInCategory="100"
        app:showAsAction="always"
        android:actionLayout="@layout/toolbar"
        android:title="Setting" />

    <item
        android:id="@+id/menu_main_setting2"
        android:icon="@drawable/ic_settings"
        android:orderInCategory="200"
        app:showAsAction="always"
        android:actionLayout="@layout/toolbar"
        android:title="Setting" />

</menu>

Bu sorun nasıl giderilir ve menü nasıl gösterilir Toolbar? teşekkürler canlarım <3


4
Buradan kontrol edebilirsiniz: stackoverflow.com/questions/31231609/…
Chol


2
Eksik olan buydu toolbar.inflateMenu (R.menu.main_manu);
skryshtafovych


Kullanarak yeni bir uygulama oluşturmaya çalışın Android Studiove kontrol edin. `Araç Çubuğu 'bağımsız bir varlık olmamalıdır.
Abhinav Saxena

Yanıtlar:


158

MainPage.java'da onCreateOptionsMenu'yu bu şekilde geçersiz kılmanız yeterli

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

69

SetSupportActionBar'ı (araç çubuğu) kullanmayın

Neden bilmiyorum ama bu benim için çalışıyor.

toolbar = (Toolbar) findViewById(R.id.main_toolbar);
toolbar.setSubtitle("Test Subtitle");
toolbar.inflateMenu(R.menu.main_manu);

Menü öğesi için bunu yap'a tıklayın

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {

            if(item.getItemId()==R.id.item1)
            {
                // do something
            }
            else if(item.getItemId()== R.id.filter)
            {
               // do something
            }
            else{
               // do something
            }

            return false;
        }
    });

Uygun bir açıklama bulduğumda bu cevabın 'neden' bölümünü güncelleyeceğim.
Yine de yardımcı olmaktan mutluluk duyarım :) Barış.


5
Cevap vermen beni endişelendiriyor ama neden kullanmamam gerektiğini açıklamıyor.
Richard Rout

5
Sizin için neyin işe yaradığını söylemek yerine neden setSupportActionBar'ı (araç çubuğu) kullanmamanız gerektiğini açıklamalısınız.
Vinicius Victor

1
Benim için işe yarayan tek şey bu. Xamarin.Android'i özel bir Araç Çubuğu ile kullanıyorum.
Washington A. Ramos

1
Bunun hakkında daha fazlasını okuyacağım ve @AbhinavSaxena cevabını güncelleyeceğim. İyi çağrı
Rohit Singh

Lütfen main_activity_layout.xml dosyasını da gönderin. Bu işe yarıyor ve olağanüstü bir çözüm, ancak cevabı tamamlamanız gerekiyor. Dinlenme cevabımda yaptım.
Abhinav Saxena

53

İşte gelecekteki ziyaretçilere referans olarak daha kapsamlı bir cevap. Genelde bir destek araç çubuğu kullanıyorum ama her iki şekilde de çalışıyor.

görüntü açıklamasını buraya girin

1. xml menüsü yapın

Bu girecek res/menu/main_menu.

  • resKlasöre sağ tıklayın ve Yeni> Android Kaynak Dosyası'nı seçin .
  • Tip main_menuDosya adı için.
  • Kaynak türü için Menü öğesini seçin.

Aşağıdaki içeriği başlangıç ​​olarak yapıştırın.

<?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/action_add"
        android:icon="@drawable/ic_add"
        app:showAsAction="ifRoom"
        android:title="Add">
    </item>
    <item
        android:id="@+id/action_settings"
        app:showAsAction="never"
        android:title="Settings">
    </item>
</menu>

Simgeyi oluşturmak için sağ tıklayıp Yeni görüntü varlığı'nıres seçebilirsiniz .ic_add

2. Menüyü şişirin

Aktivitenize aşağıdaki yöntemi ekleyin.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

3. Menü tıklamalarını yönetin

Ayrıca Faaliyetinize aşağıdaki yöntemi ekleyin:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.action_add:
            addSomething();
            return true;
        case R.id.action_settings:
            startSettings();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

daha fazla okuma


5
Sadece iki kod satırı yerine gerekli tüm bileşenleri bir arada gösterdiğiniz için teşekkür ederiz.
Big_Chair

44

Etkinliğinizde bu kodu geçersiz kılmanız gerekiyor:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu, this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main2, menu);
    return true;
}

ve araç çubuğunuzu şu şekilde ayarlayın:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

7

Ayrıca, her menü seçeneğine bazı eylemler uygulamak için buna ihtiyacınız var.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_help:
            Toast.makeText(this, "This is teh option help", Toast.LENGTH_LONG).show();
            break;
        default:
            break;
    }
    return true;
}

3

Bu yanıta katılıyorum, çünkü daha az kod satırı var ve işe yarıyor:

Android'de menü araç çubuğuna nasıl ayarlanır

Benim önerim, Android Studio Sihirbazı'nı kullanarak her zaman herhangi bir projeye başlamaktır. Bu kodda bazı stiller bulacaksınız: -

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

ve kullanım:

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout> 

Nedeniyle no action bar themebeyan styles.xmluygulanır ki Main Activityiçinde AndroidManifest.xmlbunu orada kontrol etmek zorunda böylece, hiçbir istisnası yoktur.

<activity android:name=".MainActivity" android:screenOrientation="portrait"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  1. ToolbarHer zaman bir çocuk görünümüdür, bağımsız bir varlık değildir AppBarLayoutyine çocuğudur CoordinatorLayout.
  2. Bir menü oluşturmanın kodu, ilk günden beri standart koddur ve tüm cevaplarda, özellikle işaretlenenlerde tekrar tekrar tekrarlanır, ancak farkın ne olduğunu kimse anlamadı.

HER İKİSİ DE:

Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar);

VE:

Android'de menü araç çubuğuna nasıl ayarlanır

ÇALIŞACAK.

Mutlu Kodlama :-)


2

Aktivitenizde bu yöntemi geçersiz kılın.

   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

Bu, aşağıdaki menünüzü şişirecektir:

 <?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/menu_main_setting"
            android:icon="@drawable/ic_settings"
            android:orderInCategory="100"
            app:showAsAction="always"
            android:actionLayout="@layout/toolbar"
            android:title="Setting" />

        <item
            android:id="@+id/menu_main_setting2"
            android:icon="@drawable/ic_settings"
            android:orderInCategory="200"
            app:showAsAction="always"
            android:actionLayout="@layout/toolbar"
            android:title="Setting" />

    </menu>

2

SetSupportActionBar'ı (araç çubuğu) kullanırken bile Toolbar.inflateMenu kullanılarak sağlanan yanıtı kullanabilirsiniz .

Araç çubuğu kurulum işlevini etkinlik dışında, onCreateOptionsMenu olayını tek başına bilmeyen ayrı bir sınıfa taşımam gereken bir senaryom vardı.

Dolayısıyla, bunu uygulamak için tek yapmam gereken, aşağıdakileri yaparak inflateMenu'yu çağırmadan önce Araç Çubuğunun çizilmesini beklemekti:

toolbar.post {
    toolbar.inflateMenu(R.menu.my_menu)
}

Çok temiz kabul edilmeyebilir ama yine de işi halleder.


bu benim için çalışıyor. Teşekkürler!
raquezha

1

Benim durumumda, CollapsingToolbarLayout ile bir AppBarLayout kullanıyorum ve menü her zaman ekranın dışına kaydırılıyordu, sorunumu menünün XML'sindeki android: actionLayout'u araç çubuğunun kimliğine değiştirerek çözdüm. Umarım aynı durumdaki insanlara yardım edebilir!

activity_main.xml

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:fab="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activities.MainScreenActivity"
    android:screenOrientation="portrait">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        app:elevation="0dp"
        android:theme="@style/AppTheme.AppBarOverlay">
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsingBar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="exitUntilCollapsed|scroll"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleMarginEnd="48dp"
            >
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:elevation="0dp"
                app:popupTheme="@style/AppTheme.PopupOverlay"
                app:layout_collapseMode="pin"/>
        </android.support.design.widget.CollapsingToolbarLayout>


    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

main_menu.xml

<?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/logoutMenu"
        android:orderInCategory="100"
        android:title="@string/log_out"
        app:showAsAction="never"
        android:actionLayout="@id/toolbar"/>
    <item
        android:id="@+id/sortMenu"
        android:orderInCategory="100"
        android:title="@string/sort"
        app:showAsAction="never"/> </menu>

1

XML'de içine bir satır ekleyin <Toolbar/>

<com.google.android.material.appbar.MaterialToolbar
app:menu="@menu/main_menu"/>

Java dosyasında şunu değiştirin:

 setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("Main Page");
        }

Bununla:

toolbar.setTitle("Main Page")

0

Buna basit bir düzeltme batıyordu showAsActioniçin alwaysde menu.xmlres in / menü

<?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/add_alarm"
        android:icon="@drawable/ic_action_name"
        android:orderInCategory="100"
        android:title="Add"
        app:showAsAction="always"
        android:visible="true"/>

</menu>

0
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar;        
    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
  }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_drawer,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_drawer){
           drawerLayout.openDrawer(GravityCompat.END);
            if (drawerLayout.isDrawerOpen(GravityCompat.END)) {
                drawerLayout.closeDrawer(GravityCompat.END);
            } else {
                drawerLayout.openDrawer(GravityCompat.END);
            }
        }
        return super.onOptionsItemSelected(item);
    }

res / layout / drawer_menu

<?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/action_drawer"
        android:title="@string/app_name"
        android:icon="@drawable/ic_menu_black_24dp"
        app:showAsAction="always"/>

</menu>

toolbar.xml

<com.google.android.material.appbar.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:titleTextColor="@android:color/white"
    app:titleTextAppearance="@style/TextAppearance.Widget.Event.Toolbar.Title">

     <TextView
         android:id="@+id/toolbar_title"
         android:layout_gravity="center"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:text="@string/app_name"
         android:textColor="@android:color/white"
         style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" />

</androidx.appcompat.widget.Toolbar>


0
private Toolbar toolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.my_toolbar);
    *// here is where you set it to show on the toolbar*
    setSupportActionBar(toolbar);
}

Destek eylem çubuğunu setSupportActionBar () ayarlamanız gerekir; ve değişkeninizi şu şekilde geçirin:setSupportActionBar(toolbar);

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.