Fragment
sが多いメニュードロワーを使用しています。一部のFragment
sにはメニュー項目REFRESHがありますが、一部のフラグメントではこのメニュー項目を非表示にしたい(メニューを表示したくないが、ActionBar
を非表示にしたくない)。
オーバーライドonCreateOptionsMenu()
をFragment
に追加しようとしていますが、このメニュー項目を表示したくないのですが、機能させることができません。私は多くの方法を試してみてください。どこに問題があるのか考えていますか?最後に、このメニュー項目は、MainActivityでonPrepareOptionsMenu()
と呼ばれるときにメニュードロワーをアクティブにすると非表示になりますが、Fragment
にいるときにこれを行う必要があります。
Fragment
メニュー項目の更新を非表示にする場所:
public class FindPeopleFragment extends Fragment {
public FindPeopleFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_find_people, container, false);
//setHasOptionsMenu(false);
return rootView;
}
private Menu menu=null;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
inflater.inflate(R.menu.main, menu);
this.menu=menu;
menu.findItem(R.id.refresh).setVisible(false);
getActivity().invalidateOptionsMenu();
//setHasOptionsMenu(false);
super.onCreateOptionsMenu(menu,inflater);
}
}
定義されているMainActivity MENU DRAWER:
//Slide menu item click listener
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case R.id.refresh:
Toast.makeText(this, "Refreshing data...", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
// Called when invalidateOptionsMenu() is triggered
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// if nav drawer is opened, hide the action items
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.refresh).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
メニューオプションを表示したくないFragment
では、次のようにsetHasOptionsMenu(false);
にonCreate()
が必要です。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(false);
}
ただし、非表示にするメニュー(REFRESH)はMainActivityに属します。それが常に表示される理由です。メニューをFragment
レベルで制御する(Activity
オプションメニューを表示しない)ため、Activity
からメニューコードを削除して実装することをお勧めしますFragment
で。
Activity
sとFragment
sにはそれぞれ独自のメニューを設定できます。こちらをご覧ください link 。
アイテムを非表示にするフラグメント内
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem item=menu.findItem(R.id.action_search);
if(item!=null)
item.setVisible(false);
}
フラグメントのonCreate()
setHasOptionsMenu(true);
これを試してください
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.clear();
}
これをfragmenのonCreate()に配置します
setHasOptionsMenu(true);
フラグメントクラス内
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
}
私はそれを使用したいフラグメントでメニュー項目を隠すために以下のコードを使用しました。注:コメントをお読みください
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
Fragment whichFragment=getVisibleFragment();//getVisible method return current visible fragment
String shareVisible=whichFragment.getClass().toString();
if(shareVisible.equals(AccFragment.class.toString())
||shareVisible.equals(SocFragment.class.toString())
||shareVisible.equals(DevFragment.class.toString())
){
MenuItem item=menu.findItem(R.id.action_share);
item.setVisible(false);
}
return super.onCreateOptionsMenu(menu);
}
同様のソリューションにはさまざまなバージョンがありますが、残念ながら、それらのどれも私にとってはうまくいきませんでした。オーバーフローメニュー全体を複数のメニュー項目で非表示にするのに最終的に有用だったものを共有しています。多分それは誰にとっても役立つと思った。
メニューをid
でグループ化してから、そのid
を参照しました
_@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.menu_overflow, false);
super.onPrepareOptionsMenu(menu);
}
_
個々のメニュー項目を非表示にする場合は、使用できます
_menu.getItem(R.id.action_licenses).setVisible(false);
_
重要なことは、setOptionsMenu(true)
にonViewCreated()
を含める必要があることです。
_@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setHasOptionsMenu(true);
_
これらの関数をフラグメントに追加します
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem item=menu.findItem(R.id.delete);
item.setVisible(false);
}
または、アクティビティレベルでアクションバーをホストする場合、メニューを作成したのと同じフラグメントで解決します。これにより、表示したくない他のすべてのフラグメントに追加する必要がなくなります。
public override void OnDestroy()
{
base.OnDestroy();
HasOptionsMenu = false;
}