web-dev-qa-db-ja.com

Android - onOptionsItemselectedまたはonCreateOptionsMenuの外側でメニュー項目のテキストを動的に変更する方法

onOptionsItemSelected(MenuItem item)メソッドの外側からメニュー項目のタイトルを変更しようとしています。

私はすでに次のことをしています。

public boolean onOptionsItemSelected(MenuItem item) {
  try {
    switch(item.getItemId()) {
      case R.id.bedSwitch:
        if(item.getTitle().equals("Set to 'In bed'")) {
          item.setTitle("Set to 'Out of bed'");
          inBed = false;
        } else {
          item.setTitle("Set to 'In bed'");
          inBed = true;
        }
        break;
    }
  } catch(Exception e) {
    Log.i("Sleep Recorder", e.toString());
  }
  return true;
}

ただし、この方法以外で特定のメニュー項目のタイトルを変更できるようにしたいです。

190
Garbit

アクティビティ内であなたが受け取るMenuオブジェクトへの参照を onCreateOptionsMen にしておき、それを使って必要に応じて変更が必要なMenuItemを取得することをお勧めします。例えば、あなたは以下の行に沿って何かをすることができます:

public class YourActivity extends Activity {

  private Menu menu;
  private String inBedMenuTitle = "Set to 'In bed'";
  private String outOfBedMenuTitle = "Set to 'Out of bed'";
  private boolean inBed = false;

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

    // Create your menu...

    this.menu = menu;
    return true;
  }

  private void updateMenuTitles() {
    MenuItem bedMenuItem = menu.findItem(R.id.bedSwitch);
    if (inBed) {
      bedMenuItem.setTitle(outOfBedMenuTitle);
    } else {
      bedMenuItem.setTitle(inBedMenuTitle);
    }
  }

}

あるいは、メニューが表示されるたびにメニュー項目を更新するために onPrepareOptionsMen をオーバーライドすることもできます。

359
Charles Harley

JxDarkAngelが示唆しているように、これをあなたのアクティビティのどこからでも呼び出せる

invalidateOptionsMenu();

そしてオーバーライド:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
  int savedRoute = mPrefs.getInt(getString(R.string.saved_route), 0);
  if (savedRoute > 0) {
    menu.findItem(R.id.action_route).setTitle("Route " + savedRoute);
  }
  return super.onPrepareOptionsMenu(menu);
}

はるかに良い選択です。私は https://stackoverflow.com/a/17496503/568197 から答えを使用しました

101
Todd DeLand

これを行うことで、グローバルな "Menu"オブジェクトを作成し、それをonCreateOptionMenuに割り当てることができます。

public class ExampleActivity extends AppCompatActivity
    Menu menu;

それからここに割り当てる

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

その後、割り当てられたMenuオブジェクトを使用して必要な項目を取得します

menu.findItem(R.id.bedSwitch).setTitle("Your Text");
7
Pranav Raut

SetOptionsTitle()メソッドを作成して、クラスにフィールドを設定します。といった:

String bedStatus = "Set to 'Out of Bed'";

...

public void setOptionsTitle(String status)
{
    bedStatus = status;

}

メニューが表示されたら、タイトルを自分のステータスに合わせて変更します。

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

        menu.add(bedStatus);


        // Return true so that the menu gets displayed.
        return true;
    }
5
Jack

あなたはonPrepareOptionsMenuオーバーライドを使うほうがいいです

menu.Clear ();
   if (TabActual == TabSelec.Anuncio)
   {
       menu.Add(10, 11, 0, "Crear anuncio");
       menu.Add(10, 12, 1, "Modificar anuncio");
       menu.Add(10, 13, 2, "Eliminar anuncio");
       menu.Add(10, 14, 3, "Actualizar");
   }
   if (TabActual == TabSelec.Fotos)
   {
       menu.Add(20, 21, 0, "Subir foto");
       menu.Add(20, 22, 1, "Actualizar");
   }
   if (TabActual == TabSelec.Comentarios)
   {
       menu.Add(30, 31, 0, "Actualizar");
   }

ここで

3
JxDarkAngel

このコードを使用して、一番下のナビゲーション項目をカスタマイズします

BottomNavigationView navigation = this.findViewById(R.id.my_bottom_navigation);
Menu menu = navigation.getMenu();
menu.findItem(R.id.nav_wall_see).setTitle("Hello");
3
Oumar

あなたのメニューフィールドを宣言してください。

private Menu menu;

以下はonCreateOptionsMenu()メソッドです

public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
    try {
        getMenuInflater().inflate(R.menu.menu_main,menu);
    } catch (Exception e) {
        e.printStackTrace();
        Log.i(TAG, "onCreateOptionsMenu: error: "+e.getMessage());
    }
    return super.onCreateOptionsMenu(menu);
}

以下はあなたのネームセッターの活動になります。ボタンクリックまたは条件付きコードによる

public void setMenuName(){
menu.findItem(R.id.menuItemId).setTitle(/*Set your desired menu title here*/);
}

これは私のために働きました。

2
hyperCoder

タイトルを静的に設定する必要がある人のために。これはAndroidManifest.xmlで行うことができます

<activity
    Android:name=".ActivityName"
    Android:label="Title Text" >
</activity>

Options Menu Title Text

0
moberme

フラグメントのメニューアイコンを変更する必要がありました。私はチャールズのこの質問に対する答えを少し断片に変えた。

    private Menu top_menu;

    //...
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

       setHasOptionsMenu(true);
       //...
       rootview = inflater.inflate(R.layout.first_content,null);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.fragment_menu, menu);
        this.top_menu = menu;
    }


    // my procedure
    private void updateIconMenu() {
         if(top_menu!= null) {
             MenuItem nav_undo = top_menu.findItem(R.id.action_undo);
             nav_undo.setIcon( R.drawable.back);
         }
    }
0
Almaz Vildanov

ローカルメソッド内でmenuの内容を変更したいようです。このメソッドは、イベントが発生したとき、またはアクティビティUIスレッド内でいつでも呼び出されます。

OnPrepareOptionsMenuのグローバル変数でMenuのインスタンスをオーバーライドして自分のこのメソッドで使用してみませんか。このメソッドは、イベントが発生したとき(ボタンのクリックなど)、またはアクティビティUIのスレッド、ハンドラ、または非同期タスクの後実行時に必ず呼び出されるようにしてください。

変更したいメニュー項目のインデックスを事前に知っておく必要があります。メニューをクリアしたら、メニューのXMLを展開してアイテムの名前またはアイコンを更新する必要があります。

0
Abhinav Saxena