45

「スタート」のActivityあるオプションメニューがあります。MenuItemこれを選択したら、 「停止」MenuItemが含まれるようにメニューを変更したいと思います。MenuItemそして最後に「停止」を選択したら「開始」に戻したいと思います。

これが私のコードの機能していない部分です。「開始」と「停止」の両方がリストされmymenu.xmlています。メニューが作成されたら、おそらく「停止」を削除する必要があります。

public class MyActivity extends Activity {
    private boolean isStarted = false;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        menu.removeItem(R.id.stop);
        inflater.inflate(R.menu.mymenu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.start:
            isStarted = true;
            return true;
        case R.id.stop:
            isStarted = false;
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        if(isStarted) {
            menu.removeItem(R.id.start);
            menu.add(R.id.stop);
        } else {
            menu.removeItem(R.id.stop);
            menu.add(R.id.start);
        }
        return true;
    }
}
4

6 に答える 6

100

このタイプの操作では、通常、メニュー項目を変更せずに、不要な項目を非表示にすることを選択します。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    menu.findItem(R.id.start).setVisible(!isStarted);
    menu.findItem(R.id.stop).setVisible(isStarted);
    return true;
}
于 2011-02-11T16:01:58.080 に答える
21

Flygenringの答えは正しいですが、menu.findItem()が遅く、 onPrepareOptionsMenu(Menu menu)内で呼び出すと、ユーザーエクスペリエンスが低下します。メニューの作成中にMenuItemオブジェクトを一度取得してから、画面にメニューが表示されるたびにsetVisibleを呼び出すことをお勧めします。

    MenuItem mDynamicMenuItem;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        // Get dynamic menu item
        mDynamicMenuItem = menu.findItem(R.id.menu_item);
        return true;
    }

    // Prepare the Screen's standard options menu to be displayed. This is called right 
    // before the menu is shown, every time it is shown. You can use this method to
    // efficiently enable/disable items or otherwise dynamically modify the contents.
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        // Here is just a good place to update item
        mDynamicMenuItem.setVisible(isVisible);
        return true;
    }
于 2013-07-28T06:44:04.917 に答える
6

変更が完了したら、おそらくsuper.onPrepareOptionsMenuを呼び出す必要があります。ドキュメントから:

派生クラスは、常に基本クラスの実装を呼び出す必要があります。

于 2010-11-16T23:02:46.300 に答える
3

私は解決策を得ました。基本的にMenuItem、呼び出し時にをremoveItem()削除しているため、参照も削除されます。このコードを使用すると機能します。

private boolean isStarted = false;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case 1:
        isStarted = true;
        return true;
    case 0:
        isStarted = false;
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    if(isStarted) {
        menu.removeItem(1);
        menu.add(0, 0, 0, "Stop");
    } else {
        menu.removeItem(0);
        menu.add(0, 1, 0, "Start");
    }

    return super.onPrepareOptionsMenu(menu);
}

もう一度作成する必要がありますMenuItemfalseそれがラベルの理由でもあります。実際には、viaコードMenuInflaterを作成するときにMenuは必要ないため、メニューXMLファイルも必要ありません。

于 2010-11-16T23:10:46.653 に答える
1

メニューの誤ったラベルの問題を解決したので、この投稿の情報に感謝します。私はそれを少し変更し、他の誰かの時間とフラストレーションを節約することを期待して、次のようにうまく機能する最終的なコードを用意する必要がありました。わずかに異なるソリューションですが、私が行った主な変更は、.setVisibleをTrueまたはFalseに変更したことです。それ以外は、i.shadrinsソリューションが私のニーズに最適でした。

    @Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);

    if(loggedIn) 
    {
        logIn.setVisible(false);
        logOut.setVisible(true);
    } 
    else 
    {
        logIn.setVisible(true);
        logOut.setVisible(false);
    }
    return true;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    logIn = menu.findItem(R.id.loggedOut);
    logOut = menu.findItem(R.id.loggedIn);
    return true;
}
于 2013-09-11T04:16:49.100 に答える
0

Android 3.0以降では、invalidateOptionsMenu()を呼び出して、システムがonPrepareOptionsMenu()を呼び出すように要求する必要があります。その後、メソッドのオプションメニューを変更できます。詳細については、Androidドキュメントの実行時にメニュー項目を変更するセクションhttps://developer.android.com/guide/topics/ui/menus#options-menuを確認できます。

于 2018-08-01T10:04:25.333 に答える