programing

일부 조각에서 MenuItem 숨기기

coolbiz 2021. 1. 16. 10:14
반응형

일부 조각에서 MenuItem 숨기기


나는 더 많은 메뉴 서랍을 사용합니다 Fragment. 일부에서는 Fragment메뉴 항목 REFRESH가 있지만 일부 조각에서는이 메뉴 항목을 숨기고 싶습니다 (메뉴 표시를 원하지 않지만 숨기기를 원하지 않습니다 ActionBar).

이 메뉴 항목을 표시하지 않으려는 위치 에 재정의 onCreateOptionsMenu()추가하려고 Fragment했지만 작동하지 않습니다. 코드에서 주석 처리 된 줄을 여러 가지 방법으로 시도합니다. 문제가 어디에 있는지 아십니까? 마지막으로이 메뉴 항목 onPrepareOptionsMenu()은 MainActivity에서 호출 될 때 메뉴 서랍을 활성화 할 때 숨겨 지지만 Fragment.

Fragment 메뉴 항목 REFRESH 숨기기 :

 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 메뉴 서랍 :

 //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.

Activitys 및 Fragments는 각각 별도의 메뉴를 가질 수 있습니다. 링크를 참조하십시오 .


항목을 숨기려는 조각에서

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

나는 그것을 사용하고 싶은 fragmnet에서 메뉴 항목을 숨기기 위해 아래 코드를 사용했습니다. 참고 : 의견을 읽으십시오

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

There are many different versions of similar solutions but unfortunately, none of them worked for me. I am sharing what eventually was useful for me to hide the whole overflow menu with multiple menu items. Thought maybe it's useful for anyone.

I grouped my menus with an id and then referred that id

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.setGroupVisible(R.id.menu_overflow, false);
    super.onPrepareOptionsMenu(menu);
}

If you want to hide any individual menu item then you can use

menu.getItem(R.id.action_licenses).setVisible(false);

Important thing is that you should have setOptionsMenu(true) in onViewCreated()

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setHasOptionsMenu(true);

Or solve it in the same Fragment which created the menu, if you host the Actionbar on Activity level. This way you don't have to add it on every other Fragment where you don't want to show it:

public override void OnDestroy()
{
    base.OnDestroy();
    HasOptionsMenu = false;
}

Add these functions to your Fragment

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

Just find the item you want to hide using findItem then set its visibility to false.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    MenuItem item = menu.findItem(R.id.action_settings);
    item.setVisible(false);
}

ReferenceURL : https://stackoverflow.com/questions/21498534/hide-menuitem-in-some-fragments

반응형