メニューアイテム付きのアクションバーがあります。そのメニュー項目を非表示/表示するにはどうすればよいですか。
これは私がやろうとしていることです:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
そのような項目を指すMenuItem
を取得し、その上でsetVisible
を呼び出して可視性を調整してから、アクティビティ上でinvalidateOptionsMenu()
を呼び出して、それに従ってActionBarメニューを調整します。
更新: A MenuItem
はあなたのレイアウトの一部である通常のビューではありません。その特別な何か、まったく違う。あなたのコードはnull
に対してitem
を返し、それがクラッシュの原因となっています。代わりに必要なのは、することです:
MenuItem item = menu.findItem(R.id.addAction);
最初にinvalidateOptionsMenu()
を呼び出し、次にonCreateOptionsMenu(Menu)
内でMenuItemへの参照を(menu.findItem()
を呼び出して)取得し、それにsetVisible()
を呼び出します。
この質問への補足を見つけました:
あなたが外出先であなたのメニュー項目の可視性を変更したい場合は、メニューを隠してinvalidateOptionsMenu()
を呼び出し、オーバーライドされたonCreateOptionsMenu(...)
メソッドで項目を隠したいことを覚えておくためにあなたのアクティビティでメンバー変数を設定する必要があります。
//anywhere in your code
...
mState = HIDE_MENU; // setting state
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == HIDE_MENU)
{
for (int i = 0; i < menu.size(); i++)
menu.getItem(i).setVisible(false);
}
}
私の例では、すべてのアイテムを隠しました。
はい。
invalidateOptionsMenu()
を呼び出します。これはonCreateOptionsMenu()
を呼び出します。onCreateOptionsMenu()
では、フラグ/条件をチェックして、以下のように表示または非表示にします。MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
あなたはこれを呼び出すことができます:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
更新:
コードがnull
に対してitem
を返さないようにしてください。そうしないと、アプリケーションがクラッシュする可能性があります。
私はもう少し文脈のある答えを探していました。私はそれを考え出したので、私はその答えを追加します。
デフォルトでは、共有ボタンはAndroid:visible="false"
で設定されているように隠されています。
main_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<!-- hide share button by default -->
<item
Android:id="@+id/menu_action_share"
Android:icon="@drawable/ic_share_white_24dp"
Android:visible="false"
Android:title="Share"
app:showAsAction="always"/>
<item
Android:id="@+id/menu_action_settings"
Android:icon="@drawable/ic_settings_white_24dp"
Android:title="Setting"
app:showAsAction="ifRoom"/>
</menu>
ただし、共有ボタンは何らかの条件に基づいてオプションで表示できます。
MainActivity.Java
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
MenuItem shareItem = menu.findItem(R.id.menu_action_share);
// show the button when some condition is true
if (someCondition) {
shareItem.setVisible(true);
}
return true;
}
私のために働かなかった。アイテムを非表示にするには、明示的にonPrepareOptionsMenu
を使用しなければなりませんでした。
そのため、onCreateOptionsMenu
を使用してメニューを作成し、onPrepareOptionsMenu
を使用して表示設定などを変更します。
これはActivityとFragmentの両方から私のために働きました
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (menu.findItem(R.id.action_messages) != null)
menu.findItem(R.id.action_messages).setVisible(false);
}
次のように、最初にメニューレイアウトファイルでメニュー項目の表示設定をfalseに設定します。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:visible="false"
Android:id="@+id/action_do_something"
Android:title="@string/txt_do_something"
app:showAsAction="always|withText"
Android:icon="@drawable/ic_done"/>
</menu>
メニューを展開した後は、onCreateOptionsMenu()でメニュー項目の表示設定をfalseに設定するだけです。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(menu,R.menu.menu);
MenuItem item = menu.findItem(R.id.menuItemId);
if (item != null){
item.setVisible(false);
}
}
P1r4nh4の答えはうまくいきます。ブール値のフラグを使って単純化しました。
public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == 1) //1 is true, 0 is false
{
//hide only option 2
menu.getItem(2).setVisible(false);
}
}
一度にすべてのメニュー項目を非表示にするためにtoolbar.getMenu().clear();
を使うことができます
Menuのすべての項目の可視性を設定することによって、appbarメニューまたはオーバーフローメニューは自動的に非表示になります
例
private Menu menu_change_language;
...
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
...
menu_change_language = menu;
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(true);
return super.onCreateOptionsMenu(menu);
}
他のフラグメントに進む前に、以下のコードを使用してください。
if(menu_change_language != null){
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(false);
}
値を変数に設定してinvalidateOptionsMenu()を呼び出します。
例えば
selectedid=arg2;
invalidateOptionsMenu();
public boolean onPrepareOptionsMenu(Menu menu) {
if(selectedid==1){
menu.findItem(R.id.action_setting).setVisible(false);
menu.findItem(R.id.action_s2).setVisible(false);
menu.findItem(R.id.action_s3).setVisible(false);
}
else{
if(selectedid==2){
menu.findItem(R.id.action_search).setVisible(false);
menu.findItem(R.id.action_s4).setVisible(false);
menu.findItem(R.id.action_s5).setVisible(false);
}
}
return super.onPrepareOptionsMenu(menu);
}
Android Developer Officialサイトによると、OnCreateOptionMenu(メニューメニュー)はメニュー項目やアイコンを変更することを推奨されていません。実行時の可視性など
システムがonCreateOptionsMenu()を呼び出した後、システムはユーザーが設定したMenuのインスタンスを保持し、何らかの理由でメニューが無効にされない限り再度onCreateOptionsMenu()を呼び出しません。ただし、onCreateOptionsMenu()は、初期メニュー状態を作成するためにのみ使用し、アクティビティのライフサイクル中に変更を加えないでください。
アクティビティのライフサイクル中に発生したイベントに基づいてオプションメニューを変更したい場合は、onPrepareOptionsMenu()メソッドで変更できます。このメソッドは、現在存在しているMenuオブジェクトを渡します。そのため、アイテムの追加、削除、無効化など、変更することができます。 (フラグメントはonPrepareOptionsMenu()コールバックも提供します。) --AndroidDeveloperオフィシャルサイト - /
推奨されるようにこれを使用することができます onOptionsItemSelected(MenuItem item) メソッドはユーザ入力を追跡します。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.edit) {
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra(BUNDLE_KEY, mConnection);
startActivityForResult(intent, PICK_CHANGE_REQUEST);
return true;
} else if (id == R.id.delete) {
showDialog(this);
return true;
}
return super.onOptionsItemSelected(item);
}
実行時にメニュー項目を変更する必要がある場合は、 onPrepareOptionsMenu(メニューメニュー) を使用してそれらを変更できます。
@Override
public boolean onPrepareOptionsMenu(Menu menu){
if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
}
return true;
}
https://stackoverflow.com/a/21215280/466363 - Look AlternoとSufianが回答
。
private Menu mMenu;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.track_fragment, menu);
mMenu = menu;
}
...
private void someMethod() {
...
if (mMenu != null) {
MenuItem item = mMenu.findItem(R.id.new_track);
if (item != null) {
item.setVisible(false);
ActivityCompat.invalidateOptionsMenu(this.getActivity());
}
}
...
}
ActivityCompat.invalidateOptionsMenu()はonPrepareOptionsMenu()をコールバックしません。メニューを直接更新するだけです。
私のsomeMethod()はonCreateOptionsMenu()の前でさえもいくつかの場所から呼ばれるので、mMenu!= nullをチェックしなければなりません。
上記の答えのようにすべてを行ったがメニュー項目がまだ表示されている場合は、 unique リソースを参照していることを確認してください。たとえば、onCreateOptionsMenuまたはonPrepareOptionsMenuにあります。
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem menuOpen = menu.findItem(R.id.menu_open);
menuOpen.setVisible(false);
}
Ctrl +クリックしてR.id.menu_openをクリックし、それが1つのメニューファイルにのみ存在することを確認します。このリソースが既にどこかで使用されていてアクティビティにロードされている場合は、そこに隠そうとします。
これを試して:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
もっと良い方法は、メニューにメンバー変数を使い、onCreateOptionsMenu()で初期化し、その後オプションメニューを無効にせずに単にsetVisible()を使うことだと思います。
Appcompatライブラリを使用している場合:ActivityがActionBarActivityをサブクラス化している場合は、supportInvalidateOptionsMenu()を呼び出すことができます。
1つのコマンドでメニュー内のすべての項目を非表示にする最善の方法は、メニューxmlに "group"を使用することです。オーバーフローメニューに含まれるすべてのメニュー項目を同じグループ内に追加するだけです。
この例では、常に表示される2つのメニュー項目(通常の項目と検索)と3つのオーバーフロー項目があります。
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/someItemNotToHide1"
Android:title="ITEM"
app:showAsAction="always" />
<item
Android:id="@+id/someItemNotToHide2"
Android:icon="@Android:drawable/ic_menu_search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="Android.support.v7.widget.SearchView"
Android:title="Search"/>
<group Android:id="@+id/overFlowItemsToHide">
<item Android:id="@+id/someID"
Android:orderInCategory="1" app:showAsAction="never" />
<item Android:id="@+id/someID2"
Android:orderInCategory="1" app:showAsAction="never" />
<item Android:id="@+id/someID3"
Android:orderInCategory="1" app:showAsAction="never" />
</group>
</menu>
次に、あなたのアクティビティ(onCreateOptionsMenuが望ましい)で、setGroupVisibleコマンドを使用して、すべてのメニュー項目の表示/非表示をfalseまたはtrueに設定します。
public boolean onCreateOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
このコマンドをアクティビティの他の場所で使用する場合は、必ずメニュークラスをローカルに保存し、常にmenuがnullかどうかを確認してください。createOptionsMenuの前に実行できます。
Menu menu;
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
}
public void hideMenus() {
if (menu != null) menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
このアプローチは私のために働きました:
private Menu thismenu;
if (condition)
{
if(thismenu != null)
{
thismenu.findItem(R.id.menu_save).setVisible(true);
Toast.makeText(ProfileActivity.this,
""+thismenu.findItem(R.id.menu_save).getTitle(),
Toast.LENGTH_SHORT).show();
}else
{
thismenu.findItem(R.id.menu_save).setVisible(false);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.profile_menu, menu);
thismenu = menu;
return true;
}
このコードは私のために働いた
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
if (Application.sharedPreferences.getInt("type",1) == 2)
{
menuItem = menu.findItem(R.id.menu_travel_orders);
menuItem.setVisible(false);
}
return super.onCreateOptionsMenu(menu);
}
あなたは活動からメニュー項目にアクセスしようとしています、それはスコープへのアクセスを持っていません。ビューが呼び出し元のアクティビティもレイアウトもでバインドされていないため、メニュー項目を検索するための呼び出しはnullを返します。
メニュー項目は "Navigation Bar"のような項目と結合されていて、対応するアクティビティと結合されています。
そのため、activity()でそれらのビューを初期化してから、そのビューでメニュー項目にアクセスします。
Navigation navView;
navView = findViewById(R.id.navigationView);
MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);
invalidateOptionsMenu()
を使用
onPrepareOptionsMenu(menu: Menu?)
を呼び出すため
onCreateOptionsMenu()は、初期メニュー状態を作成するためにのみ使用し、アクティビティライフサイクル中に変更を加えないでください...
イベントが発生し、メニューの更新を実行する場合、invalidateOptionsMenu()を呼び出して、システムがonPrepareOptionsMenu()を呼び出すように要求する必要があります。