OnCreateOptionsMenu()不在Fragment中调用
我有一个应用程序,得到一个活动与水平放置2个片段。
在我的活动中,我使用onCreateOptionsMEnu()来充气菜单,使用它我可以显示操作栏选项菜单。 但是,当我尝试更新我的片段之一的操作栏菜单项时,onCreateoptionsmenu()不被调用。所以,我无法更新操作栏选项菜单。 任何人都可以帮助我解决这个问题。
我的活动中的代码如下所示:
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 <br> 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(); } } }
在你的片段的onCreateView()方法中,你需要调用setHasOptionsMenu(true)来告诉主机活动你的片段有它想要添加的菜单选项。
如果您使用的主题 不支持ActionBar,则不会自动调用OnCreateOptionsMenu(),即使您已正确编写所有Java代码。
您可以打开AndroidManifest.xml,将android:theme的值更改为“@android:style / Theme.Holo.Light.DarkActionBar”或任何其他支持ActionBar的主题。
这对我工作
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); View view = inflater.inflate(R.layout.sample, null); }
只需告诉主机活动,你的片段在其构造函数中有选项菜单。
public YourFragment(){setHasOptionsMenu(true);}
尽pipe它对我很有帮助,但是从@aldorain的评论中可以看出,它是令人沮丧的
应用程序通常不应该实现构造函数。 第一个应用程序代码可以运行在片段准备使用的位置onAttach(Activity),片段实际上与其活动相关联的位置。
所以把setHasOptionsMenu(true)放在onCreateView()或onAttach()中。
@覆盖
公共视图onCreateView(LayoutInflater inflater,@Nullable ViewGroup容器,@Nullable包savedInstanceState){Viewroot = inflater.inflate(R.layout.fragment_client_requestfragment,容器,false); hideKeyboard();
getemail = getArguments().getString("email_id"); Log.e("email_id from activity",getemail); setHasOptionsMenu(true); return root; }
// set setHasOptionsMenu(true); 在片段中的onCreateView方法