Cách đặt menu thành Thanh công cụ trong Android


96

Tôi muốn sử dụng ToolBarthay vì ActionBar, nhưng không hiển thị cho tôi menu trên thanh công cụ !!! tôi muốn đặt menu chẳng hạn như các nút Làm mới hoặc Cài đặt trong ActionBar.

nhập mô tả hình ảnh ở đây

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

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

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

Làm thế nào để khắc phục sự cố này và hiển thị menu trong Toolbar? cảm ơn tất cả các dears <3


4
Bạn có thể kiểm tra tại đây: stackoverflow.com/questions/31231609/…
Chol


2
Đây là những gì tôi đã thiếu toolbar.inflateMenu (R.menu.main_manu);
skryshtafovych


Hãy thử tạo một ứng dụng mới bằng cách sử dụng Android Studiovà kiểm tra nó. `` ToolBar '' không được là một thực thể độc lập.
Abhinav Saxena

Câu trả lời:


154

chỉ cần ghi đè onCreateOptionsMenu như thế này trong MainPage.java của bạn

@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

Không sử dụng setSupportActionBar (thanh công cụ)

Tôi không biết tại sao nhưng điều này hiệu quả với tôi.

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

Đối với mục menu, bấm làm điều này

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

Sẽ cập nhật phần 'tại sao' của câu trả lời này khi tôi tìm thấy lời giải thích thích hợp.
Rất vui khi được giúp đỡ :) Bình an.


5
Bạn trả lời làm tôi lo lắng, nhưng nó không giải thích tại sao tôi không nên sử dụng nó.
Richard Rout

5
Bạn nên giải thích lý do tại sao không sử dụng setSupportActionBar (thanh công cụ) thay vì chỉ nói những gì phù hợp với bạn.
Vinicius Victor

1
Đây là điều duy nhất làm việc cho tôi. Tôi đang sử dụng Xamarin.Android với Thanh công cụ tùy chỉnh.
Washington A. Ramos

1
Tôi sẽ đọc thêm về nó và cập nhật câu trả lời @AbhinavSaxena. Cuộc gọi tốt
Rohit Singh

Vui lòng đăng cả main_activity_layout.xml. Điều này hoạt động và là một giải pháp xuất sắc, nhưng bạn phải hoàn thành câu trả lời. Phần còn lại tôi đã làm trong câu trả lời của tôi.
Abhinav Saxena,

51

Đây là câu trả lời đầy đủ hơn để tham khảo cho những vị khách trong tương lai. Tôi thường sử dụng một thanh công cụ hỗ trợ nhưng nó hoạt động tốt theo cả hai cách.

nhập mô tả hình ảnh ở đây

1. Tạo menu xml

Điều này sẽ được trong res/menu/main_menu.

  • Nhấp chuột phải vào resthư mục và chọn Mới> Tệp tài nguyên Android .
  • Kiểu main_menu cho tên tập tin.
  • Chọn Menu cho loại Tài nguyên.

Dán nội dung sau đây như một người bắt đầu.

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

Bạn có thể nhấp chuột phải resvà chọn Nội dung hình ảnh mới để tạoic_add biểu tượng.

2. Thổi phồng thực đơn

Trong hoạt động của bạn, hãy thêm phương pháp sau.

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

3. Xử lý các lần nhấp vào menu

Cũng trong Hoạt động của bạn, hãy thêm phương thức sau:

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

đọc thêm


4
Cảm ơn bạn đã thực sự hiển thị tất cả các thành phần cần thiết cùng nhau, thay vì chỉ hai dòng mã.
Big_Chair

44

Bạn cần ghi đè mã này trong Hoạt động của mình:

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

và đặt thanh công cụ của bạn như thế này:

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

7

Ngoài ra, bạn cần điều này, để thực hiện một số hành động cho mọi tùy chọn của menu.

@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

Mặc dù tôi đồng ý với câu trả lời này, vì nó có ít dòng mã hơn và nó hoạt động:

Cách đặt menu thành Thanh công cụ trong Android

Đề xuất của tôi là luôn bắt đầu bất kỳ dự án nào bằng Android Studio Wizard. Trong đoạn mã đó, bạn sẽ tìm thấy một số kiểu: -

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

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

và cách sử dụng là:

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

Do no action bar themekhai báo trong styles.xml, được áp dụng cho Main Activitytrong AndroidManifest.xml, không có ngoại lệ, vì vậy bạn phải kiểm tra nó ở đó.

<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. Đây Toolbarkhông phải là một thực thể độc lập, nó luôn là một chế độ xem con trong AppBarLayoutđó một lần nữa là con của CoordinatorLayout .
  2. Mã để tạo menu là mã chuẩn kể từ ngày đầu tiên, được lặp đi lặp lại trong tất cả các câu trả lời, đặc biệt là câu được đánh dấu, nhưng không ai nhận ra đâu là sự khác biệt.

CẢ:

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

VÀ:

Cách đặt menu thành Thanh công cụ trong Android

SẼ LÀM VIỆC.

Mã hóa vui vẻ :-)


2

Trong hoạt động của bạn ghi đè phương pháp này.

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

Điều này sẽ làm tăng menu của bạn bên dưới:

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

Trong trường hợp của tôi, tôi đang sử dụng AppBarLayout với CollapsingToolbarLayout và menu luôn được cuộn ra khỏi màn hình, tôi đã giải quyết vấn đề của mình bằng cách chuyển android: actionLayout trong XML của menu sang id của thanh công cụ. Tôi hy vọng nó có thể giúp ích cho những người cùng cảnh ngộ!

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

Đơn giản sửa chữa này được thiết lập showAsActionđể alwaysmenu.xmltrong 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 / draw_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);
}

Vâng, bạn cần đặt thanh hành động hỗ trợ setSupportActionBar (); và chuyển biến của bạn, như sau:setSupportActionBar(toolbar);


0

Trong XML, hãy thêm một dòng bên trong <Toolbar/>

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

Trong tệp java, hãy thay thế cái này:

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

Với cái này:

toolbar.setTitle("Main Page")

0

Bạn vẫn có thể sử dụng câu trả lời được cung cấp bằng Toolbar.inflateMenu ngay cả khi đang sử dụng setSupportActionBar (thanh công cụ).

Tôi đã có một tình huống mà tôi phải di chuyển chức năng thiết lập thanh công cụ vào một lớp riêng biệt bên ngoài hoạt động mà bản thân nó không biết về sự kiện onCreateOptionsMenu.

Vì vậy, để thực hiện điều này, tất cả những gì tôi phải làm là đợi Thanh công cụ được vẽ trước khi gọi InflateMenu bằng cách thực hiện như sau:

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

Có thể không được coi là rất sạch sẽ nhưng vẫn hoàn thành công việc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.