onCreateOptionsMenu di dalam Fragmen

182

Saya telah menempatkan setHasOptionsMenu(true)di dalam onCreateView, tetapi saya masih tidak bisa memanggil onCreateOptionsMenubagian dalam.

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

Di bawah ini adalah onCreateOptionsMenukode saya .

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

Pesan kesalahan yang saya dapatkan:

Metode onCreateOptionsMenu(Menu)tipe Fragmen harus menggantikan atau menerapkan metode supertipe.

Kevin
sumber
1
Terima kasih untuk 'setHasOptionsMenu (true);', saya mencari itu.
Fabricio PH

Jawaban:

497

coba ini,

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

Dan di onCreatetambahkan baris ini untuk membuat opsi muncul di AndaToolbar

setHasOptionsMenu(true);
Sino Raj
sumber
182
itu tidak akan dipanggil jika Anda tidak menambahkan baris ini:setHasOptionsMenu(true);
Yoann Hercouet
10
onCreateOptionsMenu () untuk fragmen memiliki argumen yang berbeda dari untuk Aktivitas.
Jorge
3
dan juga tipe pengembalian yang berbeda sebagai batal seperti boolean dari onCreateOptionsMenu () dalam aktivitas seperti yang disebutkan pada ans di atas.
Dexter
4
Catatan menarik: jika Anda juga menimpa onCreateOptionsMenu di Aktivitas Anda yang mengandung, kedua item menu opsi akan ditampilkan.
Adam Johns
5
setHasOptionsMenu(true);harus dipanggil onCreate()untuk lengkap.
Roel
21

Anda sudah memiliki res / menu / menu.xml file res autogenerated yang mendefinisikan action_settings .

Di MainActivity.java Anda memiliki metode berikut:

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

Dalam onCreateView()metode panggilan Fragmen Anda:

setHasOptionsMenu(true); 

dan juga menambahkan 2 metode ini:

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

Terakhir, tambahkan file res / menu / fragment_menu.xml baru yang mendefinisikan action_1 dan action_2 .

Dengan cara ini ketika aplikasi Anda menampilkan Fragmen, menunya akan berisi 3 entri:

  • action_1 dari res / menu / fragment_menu.xml
  • action_2 dari res / menu / fragment_menu.xml
  • action_settings dari res / menu / menu.xml
Alexander Farber
sumber
1
pertanyaannya adalah di dalam fragmen, bukan aktivitas
OlivierM
2
@ OlivierM jawabannya tidak menjelaskan menu fragmen. Saya menghargai penjelasan tentang bagaimana ia berinteraksi dengan menu aktivitas.
Aranda
13

Saya mencoba jawaban @Alexander Farber dan @Sino Raj. Kedua jawaban itu bagus, tetapi saya tidak bisa menggunakan onCreateOptionsMenu di dalam fragmen saya, sampai saya menemukan apa yang hilang:

Tambahkan setSupportActionBar (bilah alat) di Aktivitas saya, seperti ini:

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

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

Saya harap jawaban ini dapat membantu seseorang dengan masalah yang sama.

Filipe Brito
sumber
4

Panggilan

setSupportActionBar(toolbar)

dalam

onViewCreated(...) 

dari Fragmen

@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);
}
Chanh
sumber
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);
}
Keshav Gera
sumber