web-dev-qa-db-ja.com

アクションバーのアイテムが重複しています

アプリケーションにアクションバーがあります。 menu.xmlを使用してアクションアイテムを追加しています。サポートライブラリとしてactionbar-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>

enter image description here

20
Ganesh

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

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.signin, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
62
Renan Bandeira

このパーティーにはかなり遅れましたが、私がしたようにグーグル経由でこれに出くわした人にとって、ここに本当の問題があります。

フラグメントを作成しているアクティビティコードを投稿していませんが、次のようになっていると思います。

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

これに伴う問題は、アクティビティがそのライフサイクルを通過するとき(あなたが言うように、「デバイスをアイドル状態のままにするか、他のアプリケーションで作業するときに」発生します)、システムはあなた。ただし、このコードを使用すると、アクティビティに新しいフラグメントも追加されるため、アクティビティで複数のフラグメントが実行され、それぞれがメニューに項目を追加することになります。

投稿された回避策は重複メニューエントリの問題に対処しますが、これらの余分なフラグメントインスタンスが残り、明らかにあなたが望むものではありません。

正しい修正は、単純なnullチェックです。

    @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以外のバンドルを使用してアクティビティが再作成されていることを示すため、これをチェックして、新しいフラグメントを作成および追加する必要があるかどうかを判断します。

お役に立てば幸いです。

22
dominicoder

私はレナンバンデイラの素晴らしいソリューションを使用しましたが、エラーが発生したので、少し変更して私のためにも働きました。それから私は私の経験を共有しています:多分それは素晴らしい解決策のためにすべての信用が彼に行くのが再び役立つようになるでしょう。

@Override
    public void onCreateOptionsMenu(Menu menu ) {
       menu.clear();
       MenuInflater inflater = getMenuInflater();    
       inflater.inflate(R.menu."your current activity name ", menu);
    return true;
}
4
afra mehrparvar

@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);
    }
}
2
Idunk

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

  @Override
    public boolean onCreateOptionsMenu( Menu menu )
    {
        getMenuInflater().inflate( R.menu.main_activity_menu, menu );
        return true;
    }
0