119

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

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

Dưới đây là mã số onCreateOptionsMenu 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 pháp này onCreateOptionsMenu(Menu) loại Fragment phải ghi đè lên hoặc thực hiện một phương pháp siêu kiểu.

+0

Cảm ơn 'setHasOptionsMenu (true);', tôi đang tìm kiếm đó. –

Trả lời

365

thử này,

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

Và trong onCreate thêm dòng này để làm cho các tùy chọn xuất hiện trong bạn Toolbar

setHasOptionsMenu(true); 
+1

Vì lý do nào đó onCreateOptionsMenu không được gọi trong Fragment –

+149

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

+9

onCreateOptionsMenu() cho các đoạn có các đối số khác nhau cho Hoạt động. – Jorge

18

của bạn đã có file autogenerated res/menu /menu.xml xác định action_settings.

Trong MainActivity.java bạn có các phương pháp 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 phương pháp onCreateView() của cuộc gọi Fragment của bạn:

setHasOptionsMenu(true); 

và cũng thêm những 2 phương pháp:

@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 action_1action_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:

  • ACTION_1 từ res/menu/fragment_menu.xml
  • ACTION_2 từ res/menu /fragment_menu.xml
  • action_settings từ res/menu /menu.xml
+0

câu hỏi nằm trong phân đoạn, không hoạt động – OlivierM

+1

@OlivierM câu trả lời giải thích trình đơn phân đoạn. Tôi đánh giá cao sự giải thích về cách nó tương tác với menu hoạt động. – Aranda

5

Tôi đã thử câu trả lời @Alexander Farber và @Sino Raj.Cả hai câu trả lời là tốt đẹp, nhưng tôi không thể sử dụng onCreateOptionsMenu bên mảnh của tôi, cho đến khi tôi khám phá những gì đã mất tích:

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 điều này câu trả lời có thể hữu ích cho người có cùng vấn đề.

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

Gọi setSupportActionBar(toolbar) bên onViewCreated(...) của Fragment @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ((MainActivity)getActivity()).setSupportActionBar(toolbar); setHasOptionsMenu(true); }