我的应用程序中有Action Bar。我正在使用menu.xml添加操作项。我正在使用action bar-compat作为我的支持库。我观察到一个奇怪的问题,我的行动项目正在重复。
当我的设备闲置或与其他应用程序一起使用时,我会随机发现此问题。请在下面找到屏幕截图和我的代码:
private LoginWebActivity mContext;
private final String TAG = "LoginFragment";
// for metrics
private String mPageNameSignIn = "signin";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.webview, container, false);
return mView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mContext = (LoginWebActivity) getActivity();
initFragment();
}
@Override
public void onResume() {
super.onResume();
}
/**
* Initialises the views and variables of the fragment.
*/
@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })
protected void initFragment() {
mWebView = (WebView) mView.findViewById(R.id.webView);
Bundle b = mContext.getIntent().getExtras();
if (b != null) {
mUrl = b.getString(Constants.EXTRA_WEB_LOGIN_URL);
}
super.initFragment();
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.signin, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Navigate
switch (item.getItemId()) {
case R.id.menu_item_signup:
mContext.onSignUpClick();
break;
case android.R.id.home:
if (!goBack())
getActivity().finish();
default:
break;
}
return super.onOptionsItemSelected(item);
}
我的XML:
<?xml version="1.0" encoding="utf-8"?>
<item
android:id="@+id/menu_item_signup"
allergy:showAsAction="ifRoom"
android:title="@string/sign_up">
</item>
答案 0 :(得分:59)
在添加项目之前,您必须清除菜单对象。我遇到了同样的问题,这是我找到的最佳解决方案。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.signin, menu);
super.onCreateOptionsMenu(menu, inflater);
}
答案 1 :(得分:22)
参加派对的时间已经很晚了,但对于像我这样通过谷歌遇到这种情况的人来说,这就是真正的问题。
您没有发布创建片段的活动代码,但我会猜测它看起来像这样:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
Fragment fragment = ...
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_container, fragment)
.commit();
}
这个问题是,当活动经历其生命周期时(这将发生&#34;当我的设备闲置或与其他应用程序一起工作时,如你所说),系统将保存并为您恢复片段状态。但是使用此代码,您还要在Activity中添加一个新片段,这样您最终会在活动中运行多个片段,每个片段都会在菜单中添加一个项目。
虽然发布的解决方法会解决重复的菜单项问题,但会留下这些额外的片段实例,这显然不是您想要的。
正确的修复是一个简单的空检查:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
if (savedInstanceState == null) {
Fragment fragment = ...
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_container, fragment)
.commit();
}
}
由于系统将指示正在使用savedInstanceState参数的非null Bundle重新创建活动,因此请检查此项以确定是否应创建和添加新片段。
希望有所帮助。
答案 2 :(得分:4)
我使用了Renan Bandeira的优秀解决方案,我遇到了一些错误,所以我稍微改了一下,也为我工作了。然后我分享了我的经验:也许它再次变得有用,所有的功劳归功于他的出色解决方案。
@Override
public void onCreateOptionsMenu(Menu menu ) {
menu.clear();
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu."your current activity name ", menu);
return true;
}
答案 3 :(得分:2)
我面对同样的问题和@Szymon&#34;我从片段添加菜单选项,我创建多个片段?&#34;所以我的解决方案如下所示。
onCreate:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.menu, menu);
menu.findItem(R.id.action_one).setVisible(true);
menu.findItem(R.id.action_two).setVisible(false);
super.onCreateOptionsMenu(menu, inflater);
}
onPrepare:
@Override
public void onPrepareOptionsMenu(Menu menu) {
if (isAdded()
&& !isDetached()
&& isVisible()
&& !isRemoving()
)
{
// show the menu
if (menu.findItem(R.id.action_one).isVisible())
menu.findItem(R.id.action_one).setVisible(true);
// hide the menu
if (menu.findItem(R.id.action_two).isVisible())
menu.findItem(R.id.action_two).setVisible(false);
}
}
答案 4 :(得分:1)
您应该使用以下方法,而不会再看到重复项(请注意它只有一个Menu对象作为参数)
@Override
public boolean onCreateOptionsMenu( Menu menu )
{
getMenuInflater().inflate( R.menu.main_activity_menu, menu );
return true;
}