OnCreateOptionsMenu () Parçada çağrılmadı


107

Yatay olarak yerleştirilmiş 2 parçalı bir etkinliği olan bir uygulamam var.

Aktivitemde, eylem onCreateOptionsMenu()çubuğu seçenekleri menüsünü görüntüleyebileceğim kullanarak menüyü şişirdim. Ancak eylem çubuğu menü öğelerini parçamdan birinden güncellemeye çalıştığımda, onCreateoptionsmenu()çağrılmıyor. Bu yüzden işlem çubuğu seçenekleri menüsünü güncelleyemiyorum.

Aktivitemdeki kod aşağıdaki gibidir:

myActivity.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

myFragment.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();          
        }

     }
   }

Yanıtlar:


296

Parçanızın onCreateView()yönteminde, setHasOptionsMenu(true)ana bilgisayar etkinliğine, parçanızın eklemek istediği menü seçeneklerine sahip olduğunu söylemek için çağırmanız gerekir .


Değişikliği yaptım, ancak uygulama 11-27 01: 55: 34.468: E / AndroidRuntime (12294) ile kilitleniyor: Neden olduğu: java.lang.ClassCastException: com.android.internal.view.menu.MenuItemImpl android'e dönüştürülemiyor .widget.SearchView
Android_programmer_office

evet sorunu buldum. searchView için getActionView () eklemeyi unuttum.
Android_programmer_office

2
Ayrıca onCreateOptionsMenu için void türünü kullanmanız gerekir (Menü menüsü, MenuInflater şişirici) Boole türü çalışmaz
Bahaa Hany

15
ToolbarAktivitenizin düzeninde kullanıyorsanız , Aktivitenizde aradığınızdan emin olun setSupportActionBar(your_toolbar). Aksi takdirde setHasOptionsMenuhiçbir etkisi yoktur.
artkoenig

Sen benim aşkımsın kardeşim :)
Qadir Hussain

30

Eğer bir kullanıyorsanız tema yok değil İşlem Çubuğu, ardından OnCreateOptionsMenu desteklemek () bile düzgün tüm Java kodlarını yazdı otomatik denilen edilmeyecektir.

AndroidManifest.xml'yi açabilir, android: theme değerini "@android: style / Theme.Holo.Light.DarkActionBar" veya ActionBar'ı destekleyen diğer temalar olarak değiştirebilirsiniz.


destek kitaplığından araç çubuğunu ve tema olarak Theme.AppCompat.Light.NoActionBar'ı kullanıyorum ve aynı sorunla karşı karşıyayım ... seçenekler menüsü görüntülenmiyor..plz yardımı
Dhruvam Gupta

6
arayarak toolbar.inflateMenu(R.menu.menu_custom);
çözdüm

Aktivitenizde setSupportActionBar'ı (mToolbar) çağırmanız yeterlidir ve Parçalarda onCreateOptionsMenu otomatik olarak çağrılacaktır.
Vít Kapitola

12

bu benim için çalıştı

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

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

11

Ayrıca, geçtiğiniz Araç Çubuğu örneğinin

setSupportActionBar(toolbar);

Etkinliğinizde değil null, çünkü gerçekten öyle ise bir istisna olmayacak nullve benim yaptığım gibi birkaç saat kaybedeceksiniz.

ButterKnife'ı görüşleri birleştirmek için kullandım , ancak yanlışlıkla setSupportActionBar(toolbar)arama yapmadan önceButterKnife.bind()


1
Haris, harikasın. Bunu paylaştığınız için teşekkürler! Tam olarak bu sorunu yaşadım çünkü Kotlin kullanıyorum ve ihtiyaç duyduğunuz görünümü elde etmek için çoğu zaman findViewById vb. Yapmak zorunda değilsiniz.
DWndrer

1

Ana bilgisayar etkinliğine, parçanızın yapıcısında seçenekler menüsü olduğunu söylemeniz yeterlidir.

public YourFragment () {setHasOptionsMenu (true);}

Benim için işe yaramasına rağmen, @aldorain'in yorumunda belirtildiği gibi cesareti kırıldı

Uygulamalar genellikle bir kurucu uygulamamalıdır. Uygulama kodu, parçanın kullanılmaya hazır olduğu yerde çalışabilir, parçanın gerçekte etkinliğiyle ilişkilendirildiği nokta olan onAttach (Activity) içindedir.

Bunun yerine setHasOptionsMenu (true) 'yu onCreateView () veya onAttach () içine koyun.


Özel parçalar için kendi kurucularınızı
yazmamalısınız

1
developer.android.com/reference/android/app/Fragment.html tl; dr 'Uygulamalar genellikle bir [Fragment] yapıcısı uygulamamalıdır.'
aldorain

0

Size varsayılan olarak bir AppBar sağlamayan bir temanız var ve bunun yerine bu özelliği sağlamak için bir araç çubuğu görünümü kullanıyorsunuz, etkinliğin onCreate () yönteminde setSupportActionBar'ı (araç çubuğu) çağırmayı UNUTMAYIN parça.

OnCreate () parça yönteminizde setHasOptionsMenu (true) çağrısından sonra.

:)


-2

Set setHasOptionsMenu(true)içinde onCreateView()fragmanında yöntem.

@Override

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
 {
    Viewroot=inflater.inflate(R.layout.fragment_client_requestfragment,container,false);
  hideKeyboard();
    getemail = getArguments().getString("email_id");
    Log.e("email_id from activity",getemail);
    setHasOptionsMenu(true);
    return root;
}

1
Merhaba ve SO'ya hoş geldiniz. Lütfen yalnızca yorumlanmamış ve kötü biçimlendirilmiş yalnızca kod yanıtları göndermeyin, çünkü bu soruda açıklanan sorunun tam olarak ne olduğunu açıklamaz. İyi bir cevabı neyin oluşturduğuna dair bazı genel ipuçları için burayı kontrol edin .
Gero
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.