我有一个应用程序,它有一个活动,水平放置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();
}
}
}
答案 0 :(得分:257)
在您的片段的onCreateView()
方法中,您需要调用setHasOptionsMenu(true)
告诉主机活动您的片段包含要添加的菜单选项。
答案 1 :(得分:24)
如果您使用的主题 不支持ActionBar,则即使您正确编写了所有Java代码,也不会自动调用OnCreateOptionsMenu()。
您可以打开AndroidManifest.xml,将 android:theme 的值更改为“@android:style / Theme.Holo.Light.DarkActionBar”,或任何其他支持ActionBar的主题。
答案 2 :(得分:12)
这对我有用
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.sample, null);
}
答案 3 :(得分:3)
此外,请确保您要传递给
的工具栏实例setSupportActionBar(toolbar);
您的活动不是null
,因为如果确实是null
,您将不会得到例外,并且您将像我一样损失几个小时。
我使用ButterKnife绑定了视图,但是在我实际调用setSupportActionBar(toolbar)
之前不小心放置了ButterKnife.bind()
答案 4 :(得分:1)
只需告诉主机活动您的片段在其构造函数中有选项菜单。
public YourFragment(){setHasOptionsMenu(true);}
击>
虽然它对我有用,但是如@aldorain的评论所指出的那样,它是不鼓励的
应用程序通常不应该实现构造函数。首先 放置应用程序代码可以在片段准备好使用的地方运行 在onAttach(Activity)中,片段实际上就是这个点 与其活动有关。
所以在setCasateView()或onAttach()中放入setHasOptionsMenu(true)。
答案 5 :(得分:1)
随着时间的推移,这个收益将会递减。就我而言,它是对 androidx.fragment:fragment:1.3.0-alpha06 的 androidX 依赖,其中 this bug
只需将其更新为稳定版本即可解决问题。
答案 6 :(得分:0)
我有一个默认情况下不为您提供AppBar的主题,而您正在使用工具栏视图来提供此功能,请不要在活动的onCreate()方法中调用setSupportActionBar(toolbar)承载您的片段。
在那之后,在您的onCreate()片段方法中调用setHasOptionsMenu(true)。
:)
答案 7 :(得分:0)
使用导航体系结构组件时,未设置操作栏,因此需要手动完成:
@Override
public void onViewCreated( @NonNull View view, @Nullable Bundle savedInstanceState ) {
NavController navController = Navigation.findNavController( view );
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder( R.id.nav_1, R.id.nav_2, R.id.nav_3 ).build();
Toolbar toolbar = view.findViewById( R.id.toolbar );
((AppCompatActivity) requireActivity()).setSupportActionBar( toolbar );
CollapsingToolbarLayout collapsingToolbarLayout = view.findViewById( R.id.collapsing_toolbar );
NavigationUI.setupWithNavController( collapsingToolbarLayout, toolbar, navController, appBarConfiguration );
}
答案 8 :(得分:0)
对于那些拥有 NoActionBar 主题的人,例如:
Theme.MaterialComponents.Light.NoActionBar
解决方法如下:
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)
}
}
答案 9 :(得分:-2)
在片段中的setHasOptionsMenu(true)
方法中设置onCreateView()
。
@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;
}