Thanh công cụ Android Thêm các Mục menu cho các đoạn khác nhau


89

Tôi có một thanh công cụ cũng như một ngăn điều hướng. Khi tôi khởi động ứng dụng của mình, thanh công cụ và ngăn điều hướng sẽ được tạo. Khi tôi nhấp vào các mục trong ngăn điều hướng, nó sẽ bắt đầu các phân đoạn mới và giữ nguyên thanh công cụ. Làm cách nào để tôi thêm về cơ bản các mục menu vào thanh công cụ, chẳng hạn như tìm kiếm, thêm, chỉnh sửa khi tôi bắt đầu các phân đoạn cụ thể? Tôi không muốn chúng ở đầu chương trình, nhưng được tạo động. Ngoài ra, làm cách nào để tôi có thể nhấp vào các nút này và để chúng bắt đầu các đoạn khác. Tôi muốn nó như vậy trong một phân đoạn, nút chỉnh sửa trong thanh công cụ thực hiện một việc cụ thể so với nút chỉnh sửa trong một phân đoạn khác. Cảm ơn!

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

Thanh công cụ:

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

Câu trả lời:


167

Thêm mã tương tự vào các đoạn của bạn:

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

Bằng cách này, bạn có thể tùy chỉnh menu cho các phân đoạn của mình.


19
Đây là câu trả lời chính xác vì lệnh gọi setHasOptionsMenu (true) là bắt buộc đối với phương thức onCreateOptionsMenu đang được gọi trong phân đoạn.
John Slavick

15
Hãy nhớ về việc gọi menu.clear()vào onCreateOptionsMenu- nếu không, bạn cũng sẽ kế thừa menu từ cha mẹ.
Dart Dega

@DartDega nơi tôi đặt mã để xóa? Phân mảnh hoặc Hoạt động thưa ông, tôi không thấy menuitem trong phân mảnh của mình
famfamfam

Điều này có hoạt động với API cấp 28 không? Tôi vẫn thấy các mục menu hoạt động chính
ArdenDev

33

Đây là cách tạo menu động: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Đã chỉnh sửa:

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
sử dụng actionBarToolbar.setOnMenuItemClickListener()để xử lý các hành động của mục menu. onOptionsItemSelected()không được gọi trong tình huống này.
Lahiru Chandima

2
liên kết đưa ra là không còn nữa
Ashvin Solanki

25

Cách tốt nhất để làm điều đó:

1. Tìm thanh công cụ trong Activity và đặt nó là supportActionBar.

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

2. Sau đó Nó sẽ là một miếng bánh để xử lý các menu tùy chọn cho các phần khác nhau trong cùng một Hoạt động. Thực hiện những việc sau trong từng phân đoạn như bạn muốn:

Trong cuộc gọi Phương thức OnCreateView

setHasOptionsMenu(true);

Và cuối cùng,

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

Và để quản lý các mục menu, chúng tôi có 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 (true) thực sự hữu ích! Thank U
J.Dragon

10

Ghi đè onCreateOptionsMenuphương thức trong mọi phân đoạn của bạn.

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

@JoeEigi Tại sao bạn muốn thanh công cụ khác nhau? Bạn có thể đặt tiêu đề và menu khác nhau.
Ellie Zou

@JoeEigi vâng, bạn có thể có menu tùy chỉnh bằng cách thổi phồng xml menu tùy chỉnh. Cuộc gọi setTitle()có thể thêm tiêu đề.
Ellie Zou

@JoeEigi Có vẻ như bạn đã nhầm bối cảnh, hãy xem điều này: stackoverflow.com/questions/26998455/…
Allen Chan

1
Tôi đã tắt thanh tác vụ trong tệp kê khai của mình, nhưng vẫn hiển thị trong bố cục hoạt động của tôi phía trên thanh công cụ. Làm thế nào để thoát khỏi điều này
Joe Eigi

Có, đã làm điều đó và vẫn hiển thị trong bố cục của tôi nhưng bị chuyển ra khỏi tầm nhìn
Joe Eigi


4

Tôi đã giải quyết vấn đề này một cách chính xác. Giải pháp của tôi là như mã sau:

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

Có, tôi đã hiển thị thực đơn một cách chính xác. Nhưng làm thế nào để ẩn menu này khi đóng phân mảnh, ý tôi là Khi chúng ta chuyển sang một phân đoạn khác, ví dụ từ a -> b, menu của a vẫn hiển thị trên thanh công cụ của phân đoạn b.
Zeeshan Ahmed

sử dụng setHasOptionsMenu (false) trong onCreateView của phân mảnh b.
Kannan_SJD

4

Tôi gặp sự cố tương tự và tôi muốn thay thế menu thanh công cụ cho phù hợp với phân đoạn được hiển thị.

Vấn đề bây giờ tôi đang gặp phải là menu đã được thêm vào trước đó.

Để chỉ hiển thị menu cho phân đoạn, tôi đề nghị:

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

Hy vọng nó sẽ hữu ích.


2
chỉ cần kiểm tra nếu đơn = null trước khi gọi đến .clear ()!
Mapo

2

Dưới đây là các bước để hiển thị các tùy chọn menu khác nhau với các phân đoạn khác nhau.

Bước 1: Gọi setHasOptionsMenu (true)

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

    }

Bước 2: Tăng các mục menu tùy chọn liên quan đến phân đoạn của bạn.

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

Điều này đã giúp tôi loại bỏ nút menu không mong muốn xuất hiện trên menu mới của tôi
Batman

1

Inside XML thêm dòng này

app:menu="@menu/main_menu"

1
Thực ra bạn nói đúng! Bạn có thể chỉ định nó bằng xml và sau đó trong phân đoạn: `` ghi đè niềm vui onViewCreate (view: View, saveInstanceState: Bundle?) {Super.onViewCreate (view, saveInstanceState) toolBar.setNavigationOnClickListener {activity? .OnBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView dưới dạng SearchView searchView.setOnQueryTextListener (this)} `` '
user3193413

0

Sử dụng MaterialToolbar mới , rất dễ dàng tạo menu mục bổ sung và sử dụng để:

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

và sau đó trong mã để thiết lập Người nghe OnCLick chỉ cần thêm điều này:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
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.