onCreateOptionsMothy bên trong Fragment


182

Tôi đã đặt setHasOptionsMenu(true)bên trong onCreateView, nhưng tôi vẫn không thể gọi onCreateOptionsMenubên trong các mảnh.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                         Bundle savedInstanceState) {   
   setHasOptionsMenu(true);             
   return inflater.inflate(R.layout.facesheet, container, false);
}

Dưới đây là onCreateOptionsMenumã của tôi .

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.layout, menu);
    return (super.onCreateOptionsMenu(menu));
}

Thông báo lỗi tôi nhận được:

Phương thức onCreateOptionsMenu(Menu)loại Fragment phải ghi đè hoặc thực hiện phương thức supertype.


1
Cảm ơn vì 'setHasOptionsMothy (đúng);', tôi đã tìm kiếm điều đó.
Fabricio PH

Câu trả lời:


496

thử cái này,

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

onCreatethêm dòng này để làm cho các tùy chọn xuất hiện trongToolbar

setHasOptionsMenu(true);

182
nó sẽ không được gọi nếu bạn không thêm dòng này:setHasOptionsMenu(true);
Yoann Hercouet

10
onCreateOptionsMothy () cho các đoạn có các đối số khác với các Hoạt động.
Jorge

3
và cũng là một kiểu trả về khác như void không giống như boolean của onCreateOptionsMothy () trong hoạt động như đã đề cập ở trên ans.
Dexter

4
Lưu ý thú vị: nếu bạn cũng ghi đè onCreateOptionsMothy trong Hoạt động chứa của bạn, cả hai mục menu tùy chọn sẽ được hiển thị.
Adam Johns

5
setHasOptionsMenu(true);phải được gọi onCreate()để được hoàn thành
Roel

21

Bạn tập tin đã có những autogenerated res / menu / menu.xml định action_settings .

Trong MainActivity.java của bạn có các phương thức sau:

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_settings:
            // do stuff, like showing settings fragment
            return true;
    }

    return super.onOptionsItemSelected(item); // important line
}

Trong onCreateView()phương thức gọi Fragment của bạn:

setHasOptionsMenu(true); 

và cũng thêm 2 phương thức sau:

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

Cuối cùng, thêm tệp mới res / menu / Fragment_menu.xml xác định hành động_1 và hành động_2 .

Bằng cách này khi ứng dụng của bạn hiển thị Fragment, menu của nó sẽ chứa 3 mục:

  • hành động_1 từ res / menu / Fragment_menu.xml
  • hành động_2 từ res / menu / Fragment_menu.xml
  • hành động cài đặt từ res / menu / menu.xml

1
câu hỏi nằm trong các mảnh vỡ, không phải hoạt động
OlivierM

2
@OlivierM câu trả lời không giải thích menu mảnh. Tôi đánh giá cao lời giải thích về cách nó tương tác với menu hoạt động.
Aranda

13

Tôi đã thử các câu trả lời @Alexander Farber và @Sino Raj. Cả hai câu trả lời đều hay, nhưng tôi không thể sử dụng onCreateOptionsMothy bên trong đoạn của mình, cho đến khi tôi phát hiện ra điều còn thiếu:

Thêm setSupportActionBar (thanh công cụ) trong Hoạt động của tôi, như thế này:

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

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

Tôi hy vọng câu trả lời này có thể hữu ích cho những người có cùng vấn đề.


4

Gọi

setSupportActionBar(toolbar)

phía trong

onViewCreated(...) 

của mảnh vỡ

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    ((MainActivity)getActivity()).setSupportActionBar(toolbar);
    setHasOptionsMenu(true);
}

1
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_add_customer, container, false);
        setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
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.