23

アプリケーションにアクション バーがあります。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>

ここに画像の説明を入力

4

5 に答える 5

68

項目を追加する前に、メニュー オブジェクトをクリアする必要があります。私は同じ問題を抱えていましたが、これが私が見つけた最良の解決策でした。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.signin, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
于 2013-12-04T09:27:52.337 に答える
2

私は同じ問題に直面しており、@Szymon の状態とまったく同じです。「フラグメントからメニュー オプションを追加し、複数のフラグメントを作成しますか? だから私の解決策は以下のようでした。

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);
    }
}
于 2015-09-09T18:37:08.620 に答える
0

代わりに次のメソッドを使用する必要があり、重複はもう表示されません (引数として Menu オブジェクトしかないことに注意してください)。

  @Override
    public boolean onCreateOptionsMenu( Menu menu )
    {
        getMenuInflater().inflate( R.menu.main_activity_menu, menu );
        return true;
    }
于 2015-09-18T16:55:50.880 に答える