program tip

다른 조각에 대한 작업 표시 줄 옵션 메뉴 항목 숨기기 / 표시

radiobox 2021. 1. 9. 09:41
반응형

다른 조각에 대한 작업 표시 줄 옵션 메뉴 항목 숨기기 / 표시


3 개의 프래그먼트가있는 셜록 프래그먼트 활동이 있습니다.

조각 A, 조각 B, 조각 C는 세 조각입니다. 조각 B에서만 완료 옵션 메뉴를 표시하고 싶습니다.

그리고 액티비티는 Fragment A로 시작됩니다. Fragment B를 선택하면 완료 버튼이 추가됩니다.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    if(!menusInflated){
        inflater.inflate(R.menu.security, menu);
        menusInflated=true;
    }

    super.onCreateOptionsMenu(menu, inflater);
}

Fragment AI를 다시 시작하면 메뉴 DONE (Fragment B에서 설정 됨) 옵션을 원합니다.

setHasOptionsMenu(false);
MenuItem item = (MenuItem) menu.findItem(R.id.done_item);
item.setVisible(false);

그러나 이것은 전혀 숨기지 않으며, Activity가 Fragment A로 처음 시작되면 NullPointerException을 제공합니다.

무엇이 문제인지 알려주세요.


다음은이를 수행하는 한 가지 방법입니다.

메뉴에 "그룹"추가 :

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <group
        android:id="@+id/main_menu_group">
         <item android:id="@+id/done_item"
              android:title="..."
              android:icon="..."
              android:showAsAction="..."/>
    </group>
</menu>

그런 다음

Menu menu;

변수를 활동에 추가하고 onCreateOptionsMenu 재정의에서 설정하십시오.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    // inflate your menu here
}

그런 다음 메뉴를 표시하거나 숨기고 싶을 때이 기능을 활동에 추가하고 사용합니다.

public void showOverflowMenu(boolean showMenu){
    if(menu == null)
        return;
    menu.setGroupVisible(R.id.main_menu_group, showMenu);
}

이것이 최선의 / 유일한 방법이라고 말하는 것은 아니지만 저에게 잘 작동합니다.


이 시도...

Fragment 클래스에서 onCreateOptionsMenu ()를 다시 재정의 할 필요가 없습니다. 메뉴 항목 가시성은 Fragment 클래스에서 사용 가능한 onPrepareOptionsMenu () 메서드를 재정 의하여 변경할 수 있습니다.

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_search).setVisible(false);
    super.onPrepareOptionsMenu(menu);
}

필요한 작업 항목 (작업 단추)을 조각의 ActionBar에 표시하려면 다음과 같이하십시오.

save항목 목록을 보는 Fragment가 아닌 항목에 대한 입력을 수락하는 Fragment에서만 버튼을 표시 하려는 경우 항목을 보는 Fragment의 OnCreateOptionsMenu메서드에 다음을 추가 합니다.

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    if (menu != null) {

        menu.findItem(R.id.action_save_item).setVisible(false);
    }
}

참고 : 이 작업을 수행하려면 onCreate()프래그먼트 (이 예에서 항목 버튼, 항목보기 프래그먼트를 숨기려는 위치)에 메서드 가 필요하고 다음과 setHasOptionsMenu(true)같이 추가 합니다.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

최선의 선택이 아닐 수도 있지만 작동하며 간단합니다.


이것은 확실히 작동합니다 ...

// Declare
Menu menu;
MenuItem menuDoneItem;

// Then in your onCreateOptionMenu() method write the following...
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        this.menu=menu;
        inflater.inflate(R.menu.secutity, menu);
            }

// In your onOptionItemSelected() method write the following...
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.done_item:
                this.menuDoneItem=item;
                someOperation();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

// Now Making invisible any menu item...
public void menuInvisible(){
setHasOptionsMenu(true);// Take part in populating the action bar menu
            menuDoneItem=(MenuItem)menu.findItem(R.id.done_item);
                menuRefresh.setVisible(false); // make true to make the menu item visible.
}

//Use the above method whenever you need to make your menu item visible or invisiable

자세한 내용 은이 링크참조 할 수도 있습니다 . 매우 유용한 링크 입니다.


MenuItem Import = menu.findItem(R.id.Import);
  Import.setVisible(false)

자세한 내용은 http://androiddhina.blogspot.in/2015/05/android-how-to-hide-menu-item-in.html을 참조하세요.


이 시도

@Override
public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custom_actionbar, menu);
    menu.setGroupVisible(...);
}

각 조각에 대한 메뉴와 현재 사용중인 조각을 표시하는 전역 변수를 만들 수 있습니다. onCreateOptionsMenu에서 변수 값을 확인하고 올바른 메뉴를 팽창시킵니다.

 @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         if (fragment_it == 6) {
             MenuInflater inflater = getMenuInflater();
             inflater.inflate(R.menu.custom_actionbar, menu);
         }
     } 

메뉴의 모든 항목의 표시 여부를 설정하면 앱바 메뉴 또는 오버플로 메뉴가 자동으로 숨겨집니다.

 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);
}

질문이 오래되고 답변되었지만. 위에서 언급 한 것보다 더 간단한 대답이 있습니다. 다른 변수를 사용할 필요가 없습니다. 가시성 작업 (표시 / 숨기기)을 수행하는 대신 원하는 조각이 무엇이든 액션 바에 버튼을 만들 수 있습니다.

메뉴 항목이 필요한 모든 부분에 다음을 추가하십시오.

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

샘플 menu.xml 파일 :

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_addFlat"
        android:icon="@drawable/add"
        android:showAsAction="ifRoom|withText"
        android:title="@string/action_addFlat"/>
</menu>

onclick 이벤트 처리는 평소와 같습니다.


안녕하세요 저는 이것에 대한 최선의 해결책을 얻었습니다. 메뉴 생성 방법에서 특정 항목을 숨기고 다른 조각에 해당 항목을 표시해야한다고 가정합니다. 하나는 편집이고 다른 하나는 삭제입니다. 예를 들어 메뉴 xml은 다음과 같습니다.

sell_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">

<item
    android:id="@+id/action_edit"
    android:icon="@drawable/ic_edit_white_shadow_24dp"
    app:showAsAction="always"
    android:title="Edit" />

<item
    android:id="@+id/action_delete"
    android:icon="@drawable/ic_delete_white_shadow_24dp"
    app:showAsAction="always"
    android:title="Delete" />

이제 활동에서 두 가지 방법을 재정의하고 필드 변수를 mMenu로 만듭니다.

  private Menu mMenu;         //  field variable    


  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.sell_menu, menu);
    this.mMenu = menu;

    menu.findItem(R.id.action_delete).setVisible(false);
    return super.onCreateOptionsMenu(menu);
  }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_delete) {
       // do action
        return true;
    } else if (item.getItemId() == R.id.action_edit) {
      // do action
        return true;
    }

    return super.onOptionsItemSelected(item);
 }

Make two following method in your Activity & call them from fragment to hide and show your menu item. These method are as:

public void showDeleteImageOption(boolean status) {
    if (menu != null) {
        menu.findItem(R.id.action_delete).setVisible(status);
    }
}

public void showEditImageOption(boolean status) {
    if (menu != null) {
        menu.findItem(R.id.action_edit).setVisible(status);
    }
}

That's Solve from my side,I think this explanation will help you.


Late to the party but the answers above didn't seem to work for me.

My first tab fragment (uses getChildFragmentManager() for inner tabs) has the menu to show a search icon and uses android.support.v7.widget.SearchView to search within the inner tab fragment but navigating to other tabs (which also have inner tabs using getChildFragmentManager()) would not remove the search icon (as not required) and therefore still accessible with no function, maybe as I am using the below (ie outer main tabs with each inner tabs)

getChildFragmentManager(); 

However I use the below in my fragments containing/using the getChildFragmentManager() for inner tabs.

    //region onCreate
    @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    //access setHasOptionsMenu()
    setHasOptionsMenu(true);

    }
    //endregion onCreate

and then clear the menu item inside onPrepareOptionsMenu for fragments(search icon & functions)

    @Override
    public void onPrepareOptionsMenu(Menu menu) {

    super.onPrepareOptionsMenu(menu);

    //clear the menu/hide the icon & disable the search access/function ...
    //this will clear the menu entirely, so rewrite/draw the menu items after if needed
    menu.clear();

    }

Works well and navigating back to the tab/inner tab with the search icon functions re displays the search icon & functions.

Hope this helps...

ReferenceURL : https://stackoverflow.com/questions/23178663/hide-show-action-bar-option-menu-item-for-different-fragments

반응형