OnCreateOptionsMenu() wird im Fragment nicht aufgerufen

Lesezeit: 7 Minuten

Benutzer-Avatar
Android_Programmierer_Büro

Ich habe eine App, die eine Aktivität mit 2 horizontal platzierten Fragmenten hat.

In meiner Tätigkeit habe ich das Menü mit aufgeblasen onCreateOptionsMenu() mit dem ich das Aktionsleisten-Optionsmenü anzeigen kann. Aber wenn ich versuche, die Menüelemente der Aktionsleiste von einem meiner Fragmente zu aktualisieren, wird die onCreateoptionsmenu() wird nicht gerufen. Daher kann ich das Optionsmenü der Aktionsleiste nicht aktualisieren.

Der Code in meiner Aktivität lautet wie folgt:

meineAktivität.java

package com.andr.androidtablelist;

import java.io.IOException;

import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

import com.andr.fragments.ListLeftFragment;
import com.andr.utils.DBHelper;

      public class TabletActivity extends Activity {
    ActionBar actionBar = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DBHelper dbhelper;
        dbhelper = new DBHelper(this);
        try {
            dbhelper.createDatabase();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        setContentView(R.layout.activity_tablet);
        actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(false);
        getFragmentManager().beginTransaction()
                .replace(R.id.master, ListLeftFragment.newInstance()).commit();
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            Toast.makeText(
                    getApplicationContext(),
                    "Back Stack Count::"
                            + getFragmentManager().getBackStackEntryCount(),
                    Toast.LENGTH_LONG).show();
            if (getFragmentManager().getBackStackEntryCount() == 1) {
                actionBar.setDisplayHomeAsUpEnabled(false);
            }
            if (getFragmentManager().getBackStackEntryCount() > 1) {
                getFragmentManager().popBackStack();

            }
            return true;

        }
        return super.onOptionsItemSelected(item);
    }

}
      // http://www.vogella.com/articles/AndroidListView/article.html

meinFragment.java

      package com.andr.fragments;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;

import com.andr.androidtablelist.R;
import com.andr.helper.LazyHelper;

   public class ListLeftFragment extends Fragment{
    private static ListLeftFragment listFragment = null;

    public static ListLeftFragment newInstance(){
        listFragment = new ListLeftFragment();      
        return listFragment;
    }

     @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);


    }

     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
         View v =  inflater.inflate(R.layout.fragment_listlayout, container,false);
         getActivity().invalidateOptionsMenu();
         ListView lv = (ListView)v.findViewById(R.id.lview);
         String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                    "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                    "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux",
                    "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
                    "Android", "iPhone", "WindowsMobile" };
         getActivity().getActionBar().setTitle("LeftList");

          ArrayList<String> list = new ArrayList<String>();
         LazyHelper lHelper = new LazyHelper(getActivity());
         list = lHelper.getLazyDetials();

           /* for (int i = 0; i < values.length; ++i) {
              list.add(values[i]);
            }
            final StableArrayAdapter adapter = new StableArrayAdapter(getActivity(),
                android.R.layout.simple_list_item_1, list);*/
            LeftListAdapter lAdapter = new LeftListAdapter(getActivity(),list);
            lv.setAdapter(lAdapter);
            lv.setOnItemClickListener(new OnItemClickListener()
            {

                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int pos, long arg3) {
                    final String clickedData = (String)arg0.getItemAtPosition(pos);
                    Bundle bundle = new Bundle();
                    bundle.putString("clickedItemName", clickedData);
                    Fragment detailFragment = DetailFormRightFragment.newInstance();
                    detailFragment.setArguments(bundle);
                    getActivity().getFragmentManager().beginTransaction().replace(R.id.details, detailFragment).addToBackStack(null).commit();
                }

            }
                    );
         return v;
    }


     @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        getActivity().getMenuInflater().inflate(R.menu.search, menu);
        SearchView searchView=(SearchView)menu.findItem(R.id.search);
        searchView.setIconifiedByDefault(true);
    } 

     @Override
    public boolean onOptionsItemSelected(MenuItem item) {

         super.onOptionsItemSelected(item);
         return false;
    }


     @Override
    public void onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
        /*MenuItem item;
        menu.clear();
        getActivity().getMenuInflater().inflate(R.menu.search, menu);
        SearchView searchView=(SearchView)menu.findItem(R.id.search);
        searchView.setIconifiedByDefault(true);*/
    }

     private class StableArrayAdapter extends ArrayAdapter<String> {

            HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

            public StableArrayAdapter(Context context, int textViewResourceId,
                List<String> objects) {
              super(context, textViewResourceId, objects);
              for (int i = 0; i < objects.size(); ++i) {
                mIdMap.put(objects.get(i), i);
              }
            }

            @Override
            public long getItemId(int position) {
              String item = getItem(position);
              return mIdMap.get(item);
            }

            @Override
            public boolean hasStableIds() {
              return true;
            }

          }

     private class LeftListAdapter extends BaseAdapter implements OnClickListener {
         private Context mcontext;
         ArrayList<String> listData;
         private  LayoutInflater inflater=null;
         public LeftListAdapter(Context context, ArrayList<String> listItems) {
              mcontext=context;
              listData=listItems;
              inflater = (LayoutInflater)mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         }

        @Override
        public int getCount() {
            return listData.size();
        }

        @Override
        public Object getItem(int arg0) {
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View view, ViewGroup arg2) {
            // create a ViewHolder reference
            View vi=view;
            if(vi==null){
                vi = inflater.inflate(R.layout.item, null);
            }
            TextView text=(TextView)vi.findViewById(R.id.text);
            text.setText(listData.get(position));
            vi.setOnClickListener(this);
            return vi;
        }

        @Override
        public void onClick(View vi) {
            TextView text=(TextView)vi.findViewById(R.id.text);
            Bundle bundle = new Bundle();
            bundle.putString("clickedItemName", text.getText().toString());
            Fragment detailFragment = DetailFormRightFragment.newInstance();
            detailFragment.setArguments(bundle);
            getActivity().getFragmentManager().beginTransaction().replace(R.id.details, detailFragment).addToBackStack(null).commit();          
        }

     }
   }

Benutzer-Avatar
verdammt Varmit

In deinem Fragment onCreateView() Methode müssen Sie aufrufen setHasOptionsMenu(true) um der Host-Aktivität mitzuteilen, dass Ihr Fragment Menüoptionen hat, die es hinzufügen möchte.

  • Ich habe die Änderung vorgenommen, aber die App stürzt mit 11-27 01:55:34.468 ab: E/AndroidRuntime(12294): Caused by: java.lang.ClassCastException: com.android.internal.view.menu.MenuItemImpl kann nicht auf Android übertragen werden .widget.SearchView

    – Android_Programmierer_Büro

    26. November 2013 um 20:26 Uhr


  • ja ich habe das Problem gefunden. vergessen, getActionView() für searchView hinzuzufügen.

    – Android_Programmierer_Büro

    26. November 2013 um 20:29 Uhr

  • Außerdem müssen Sie den void-Typ für onCreateOptionsMenu (Menümenü, MenuInflater-Inflater) verwenden, der boolesche Typ funktioniert nicht

    – Baha Hany

    9. Juli 2014 um 15:44 Uhr

  • Wenn Sie verwenden Toolbar Stellen Sie im Layout Ihrer Aktivität sicher, dass Sie anrufen setSupportActionBar(your_toolbar) in Ihrer Aktivität. Andernfalls setHasOptionsMenu hat keine Wirkung.

    – artkönig

    19. Februar 2018 um 15:29 Uhr

Wenn Sie eine verwenden Thema das tut nicht ActionBar unterstützen, dann wird OnCreateOptionsMenu() nicht automatisch aufgerufen, auch wenn Sie alle Java-Codes richtig geschrieben haben.

Sie können AndroidManifest.xml öffnen und den Wert von ändern Android: Thema zu “@android:style/Theme.Holo.Light.DarkActionBar” oder anderen Designs, die ActionBar unterstützen.

  • Ich verwende die Symbolleiste aus der Support-Bibliothek und Theme.AppCompat.Light.NoActionBar als Design und stehe vor dem gleichen Problem … kein Optionsmenü wird angezeigt … plz-Hilfe

    – Dhruvam Gupta

    24. Juni 2017 um 15:10 Uhr

  • Ich habe es per Anruf gelöst toolbar.inflateMenu(R.menu.menu_custom);

    – Dhruvam Gupta

    25. Juni 2017 um 5:48 Uhr

  • Rufen Sie einfach setSupportActionBar(mToolbar) in Ihrer Aktivität auf und onCreateOptionsMenu in Fragments wird automatisch aufgerufen.

    – Vit Kapitola

    1. Juli 2020 um 9:17 Uhr


Benutzer-Avatar
Anisetti Nagendra

das hat bei mir funktioniert

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    setHasOptionsMenu(true);
    View view = inflater.inflate(R.layout.sample, null);
}

Stellen Sie außerdem sicher, dass die Toolbar-Instanz, an die Sie übergeben werden

setSupportActionBar(toolbar);

in Ihrer Aktivität nicht nullda Sie keine Ausnahme erhalten, wenn dies tatsächlich der Fall ist null und Sie werden ein paar Stunden verlieren, wie ich es getan habe.

ich benutzte Buttermesser um die Ansichten zu binden, aber versehentlich platziert setSupportActionBar(toolbar) bevor ich tatsächlich angerufen habe ButterKnife.bind()

Für diejenigen, die das NoActionBar-Thema haben, wie zum Beispiel:
Theme.MaterialComponents.Light.NoActionBar die lösung ist wie folgt:

Kotlin-Version

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    setupToolbar()
    
}

private fun setupToolbar() {
    setHasOptionsMenu(true)
    // The other option is using val toolbar = findViewById(R.id.toolvar) 
    // and add as parameter instead of the binding option
    (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) 
    (activity as AppCompatActivity).supportActionBar?.setDisplayShowTitleEnabled(false)
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)
    inflater.inflate(R.menu.my_menu, menu)
}


override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.menu_item_1
            //TODO: implement something here for option 1
            true
        }
        R.id.menu_item_2 -> {
            //TODO: implement something here for option 2
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

Teilen Sie der Host-Aktivität einfach mit, dass Ihr Fragment ein Optionsmenü in seinem Konstruktor hat.

public YourFragment() {setHasOptionsMenu(true);}

Obwohl es für mich funktioniert hat, wird davon abgeraten, wie im Kommentar von @aldorain angegeben

Anwendungen sollten im Allgemeinen keinen Konstruktor implementieren. Der erste Ort, an dem Anwendungscode ausgeführt werden kann, wo das Fragment zur Verwendung bereit ist, befindet sich in onAttach(Activity), dem Punkt, an dem das Fragment tatsächlich mit seiner Aktivität verknüpft ist.

Setzen Sie also stattdessen setHasOptionsMenu(true) in onCreateView() oder onAttach().

Benutzer-Avatar
Moreno

Wenn Sie ein Design haben, das standardmäßig keine AppBar bereitstellt, und Sie stattdessen eine Symbolleistenansicht verwenden, um diese Funktion bereitzustellen, VERGESSEN SIE NICHT, setSupportActionBar(toolbar) in der onCreate()-Methode der Aktivität aufzurufen, die Ihre hostet Fragmente.

Rufen Sie danach setHasOptionsMenu(true) in Ihrer onCreate()-Fragmentmethode auf.

🙂

1335010cookie-checkOnCreateOptionsMenu() wird im Fragment nicht aufgerufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy