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;
}
ただし、この方法以外で特定のメニュー項目のタイトルを変更できるようにしたいです。
アクティビティ内であなたが受け取る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 をオーバーライドすることもできます。
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 から答えを使用しました
これを行うことで、グローバルな "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");
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;
}
あなたは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");
}
ここで 例
このコードを使用して、一番下のナビゲーション項目をカスタマイズします
BottomNavigationView navigation = this.findViewById(R.id.my_bottom_navigation);
Menu menu = navigation.getMenu();
menu.findItem(R.id.nav_wall_see).setTitle("Hello");
あなたのメニューフィールドを宣言してください。
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*/);
}
これは私のために働きました。
タイトルを静的に設定する必要がある人のために。これはAndroidManifest.xmlで行うことができます
<activity
Android:name=".ActivityName"
Android:label="Title Text" >
</activity>
フラグメントのメニューアイコンを変更する必要がありました。私はチャールズのこの質問に対する答えを少し断片に変えた。
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);
}
}
ローカルメソッド内でmenuの内容を変更したいようです。このメソッドは、イベントが発生したとき、またはアクティビティUIスレッド内でいつでも呼び出されます。
OnPrepareOptionsMenuのグローバル変数でMenuのインスタンスをオーバーライドして自分のこのメソッドで使用してみませんか。このメソッドは、イベントが発生したとき(ボタンのクリックなど)、またはアクティビティUIのスレッド、ハンドラ、または非同期タスクの後実行時に必ず呼び出されるようにしてください。
変更したいメニュー項目のインデックスを事前に知っておく必要があります。メニューをクリアしたら、メニューのXMLを展開してアイテムの名前またはアイコンを更新する必要があります。