Як встановити меню на Панель інструментів в Android


96

Я хочу використовувати ToolBarзамість ActionBar, але не показувати мені меню на панелі інструментів !!! я хочу встановити меню, таке як Оновити або Налаштування в меню ActionBar.

введіть тут опис зображення

Код Toolbar.xml:

<?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:

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 код:

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

Як виправити цю проблему та показати меню в Toolbar? дякую всім дорогим <3


4
Ви можете перевірити тут: stackoverflow.com/questions/31231609/…
Чол


2
Це те, чого мені не вистачало toolbar.inflateMenu (R.menu.main_manu);
скриштафович


Спробуйте створити нову програму за допомогою Android Studioта перевірити її. "Панель інструментів" не повинна бути самостійною сутністю.
Abhinav Саксен

Відповіді:


154

просто перевизначте onCreateOptionsMenu, як це, у вашому MainPage.java

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

66

Не використовувати setSupportActionBar (панель інструментів)

Не знаю чому, але це для мене працює.

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

Для пункту меню натисніть зробити це

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

Оновить частину цієї відповіді "чому", коли я знайду належне пояснення.
У будь-якому разі раді допомогти :) Мир.


5
Ви відповідаєте, що мене насторожує, але це не пояснює, чому я не повинен цим користуватися.
Річард Рут,

5
Ви повинні пояснити, чому не використовувати setSupportActionBar (панель інструментів), а не просто говорити, що вам підходить.
Вініцій Віктор

1
Це єдине, що мені вдалося. Я використовую Xamarin.Android зі спеціальною панеллю інструментів.
Вашингтон А. Рамос,

1
Я прочитаю більше про це та оновлю відповідь @AbhinavSaxena. Хороший дзвінок
Рохіт Сінгх

Будь ласка, опублікуйте також main_activity_layout.xml. Це працює і є чудовим рішенням, але ви повинні доповнити відповідь. Відпочинок я зробив у своїй відповіді.
Абхінав Саксена

51

Ось повна відповідь як посилання на майбутніх відвідувачів. Я зазвичай використовую панель інструментів підтримки, але вона працює так само добре в будь-якому випадку.

введіть тут опис зображення

1. Складіть меню xml

Це буде в res/menu/main_menu.

  • Клацніть правою кнопкою миші resпапку та виберіть Створити> Файл ресурсу Android .
  • Введіть main_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_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>

Ви можете клацнути правою кнопкою миші resта вибрати Новий об’єкт зображення, щоб створити ic_addпіктограму.

2. Надуйте меню

У своїй діяльності додайте такий спосіб.

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

3. Обробляти кліки меню

Також у своїй діяльності додайте такий спосіб:

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

Подальше читання


4
Дякуємо, що фактично показали всі необхідні компоненти разом, а не лише два рядки коду.
Big_Chair

44

Вам потрібно замінити цей код у своїй діяльності:

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

і встановіть панель інструментів так:

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

7

Також вам це потрібно, щоб здійснити певну дію для всіх параметрів меню.

@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

Хоча я погоджуюся з цією відповіддю, оскільки в ньому менше рядків коду і що він працює:

Як встановити меню на Панель інструментів в Android

Моя порада - завжди починати будь-який проект за допомогою майстра Android Studio. У цьому коді ви знайдете кілька стилів: -

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

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

і використання:

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

Через no action bar themeзаявлене в styles.xml, що застосовується до Main Activityв AndroidManifest.xml, немає винятків, тому вам доведеться перевірити його там.

<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. Це Toolbarне є незалежною сутністю, це завжди дочірній погляд у AppBarLayoutтому, що знову є дитиною CoordinatorLayout.
  2. Код для створення меню - це стандартний код з першого дня, який повторюється знову і знову у всіх відповідях, особливо в позначеному, але ніхто не зрозумів, у чому різниця.

І те, і інше:

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

І:

Як встановити меню на Панель інструментів в Android

БУДУ ПРАЦЮВАТИ.

Щасливого кодування :-)


2

У своїй діяльності перевизначте цей метод.

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

Це роздує ваше меню нижче:

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

1

У моєму випадку я використовую AppBarLayout з CollapsingToolbarLayout, і меню завжди прокручувалося з екрана, я вирішив свою проблему, переключивши android: actionLayout у меню XML на ідентифікатор панелі інструментів. Сподіваюся, це може допомогти людям у такій самій ситуації!

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>

0

Простим виправленням цього було встановлення showAsActionзначення alwaysу menu.xmlв res / 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/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);
}

Ну, вам потрібно встановити панель дій підтримки setSupportActionBar (); і передайте свою змінну приблизно так:setSupportActionBar(toolbar);


0

У XML додайте один рядок всередину <Toolbar/>

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

У файлі Java замініть це:

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

з цим:

toolbar.setTitle("Main Page")

0

Ви все одно можете використовувати відповідь, надану за допомогою Toolbar.inflateMenu, навіть під час використання setSupportActionBar (панелі інструментів).

У мене був сценарій, коли мені довелося перенести функціональність налаштування панелі інструментів в окремий клас поза діяльністю, який сам по собі не знав про подію onCreateOptionsMenu.

Отже, щоб реалізувати це, мені потрібно було лише почекати, поки панель інструментів буде намальована, перш ніж викликати inflateMenu, виконавши наступне:

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

Може вважатися не дуже чистим, але все одно робить свою роботу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.