Android的:改变可视性上的菜单项不断变化的片段 [英] Android: Changing visibility on menu items with changing fragment

查看:261
本文介绍了Android的:改变可视性上的菜单项不断变化的片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要改变的一个片段活动(ABS)的菜单项的可视性当过我改变片段的活性。该片段是SherlockListFragments

我要显示/隐藏菜单项纺织我创建菜单创建:

 公共布尔onCreateOptionsMenu(功能菜单){
    //充气菜单;这增加了项目操作栏,如果它是present。
    MenuInflater充气= getSupportMenuInflater();

    IcsSpinner herbSortSpinner =新IcsSpinner(本,空,R.attr.actionDropDownStyle);
    SpinnerAdapter herbSortSpinnerAdapter = ArrayAdapter.createFromResource(这一点,R.array.herb_sort_elements,android.R.layout.simple_spinner_dropdown_item);
    herbSortSpinner.setAdapter(herbSortSpinnerAdapter);
    herbSortSpinner.setOnItemSelectedListener(本);
    herbSortSpinner.setId(HERB_SPINNER_ID);
    menu.add(R.string.menu_sort).setActionView(herbSortSpinner).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

    IcsSpinner noteSortSpinner =新IcsSpinner(本,空,R.attr.actionDropDownStyle);
    SpinnerAdapter noteSortSpinnerAdapter = ArrayAdapter.createFromResource(这一点,R.array.note_sort_elements,android.R.layout.simple_spinner_dropdown_item);
    noteSortSpinner.setAdapter(noteSortSpinnerAdapter);
    noteSortSpinner.setOnItemSelectedListener(本);
    noteSortSpinner.setId(NOTE_SPINNER_ID);
    menu.add(R.string.menu_sort).setActionView(noteSortSpinner).setVisible(false).setEnabled(false).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

    inflater.inflate(R.menu.activity_lexicon,菜单);
    menuHolder.setMenu(菜单);
    返回true;
}
 

我的切换碎片逻辑是:

 公共布尔onNavigationItemSelected(INT位置,长的itemId){

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    开关(位置){
    情况下0:
        名单<香草> herbList = findHerbsByIntent(getHerbLocale());
        HerbListFragment herbListFragment =新HerbListFragment();
        herbListFragment.setListAdapter(新HerbListAdapter(这一点,getHerbLocale(),herbList));
        fragmentTransaction.replace(R.id.fragment_container,herbListFragment,HERB_LIST_FRAGMENT_TAG);
        //menuHolder.showHerbsSpinner();
        打破;
    情况1:
        SymptomListFragment symptomListFragment =新SymptomListFragment();
        symptomListFragment.setListAdapter(新SymptomListAdapter(此,getDefaultSymptomLocale()));
        fragmentTransaction.replace(R.id.fragment_container,symptomListFragment,SYMPTOM_LIST_FRAGMENT_TAG);
        //menuHolder.showHerbsSpinner();
        打破;
    案例2:
        NoteRepository noteRepository =新NoteRepository(本);
        名单<注意>注释= noteRepository.getNoticables(ReferedType.HERB);
        NoteListFragment noteListFragment =新NoteListFragment();
        noteListFragment.setListAdapter(新NoteListAdapter(这一点,getHerbLocale(),备注));
        fragmentTransaction.replace(R.id.fragment_container,noteListFragment,NOTE_LIST_FRAGMENT_TAG);
        //menuHolder.showNotesSpinner();
        打破;
    案例3:
        FavoriteRepository favoriteRepository =新FavoriteRepository(本);
        设置<整数GT; favoriteHerbs = favoriteRepository.getFavorables(ReferedType.HERB);
        名单<香草> favoriteHerbList = herbRepository.getHerbsByIds(favoriteHerbs,getHerbLocale());
        FavoriteHerbListFragment favoriteHerbListFragment =新FavoriteHerbListFragment();
        favoriteHerbListFragment.setListAdapter(新HerbListAdapter(这一点,getHerbLocale(),favoriteHerbList));
        fragmentTransaction.replace(R.id.fragment_container,favoriteHerbListFragment,HERB_LIST_FRAGMENT_TAG);
        //menuHolder.showHerbsSpinner();
        打破;
    }
    fragmentTransaction.commit();

    返回true;
}
 

我的第一个想法是保持在一个支架类的菜单对象和操作它有每当我切换片段(在上面的每一个case语句)。

 静态类MenuHolder {

    私人菜单mMenu;

    无效的SetMenu(功能菜单){
        mMenu =菜单;
    }

    无效showNotesSpinner(){
        如果(mMenu!= NULL){
            mMenu.findItem(HERB_SPINNER_ID).setVisible(假).setEnabled(假);
            mMenu.findItem(NOTE_SPINNER_ID).setVisible(真).setEnabled(真正的);
        }
    }

    无效showHerbsSpinner(){
        如果(mMenu!= NULL){
            mMenu.findItem(NOTE_SPINNER_ID).setVisible(假).setEnabled(假);
            mMenu.findItem(HERB_SPINNER_ID).setVisible(真).setEnabled(真正的);
        }
    }
}
 

我的问题是,有一个与给定的ID,它是活动局部常量没有菜单项。我得到一个NPE在这里。没有任何人有一个想法,我怎么能解决呢?有没有更好的方式来更改转换片段菜单?

最好的问候 卡斯滕

解决方案
  

有没有更好的方式来更改转换片段菜单?

也许是肯定的:)。

  • 在您的片段的onCreate ,补充一点:

    <一个href="http://developer.android.com/reference/android/app/Fragment.html#setHasOptionsMenu%28boolean%29">setHasOptionsMenu (真正的);

本文档:

  

报告,该片段想通过接收调用onCreateOptionsMenu(菜单,MenuInflater)和相关方法参加填充选项菜单。

  • 覆盖<一href="http://developer.android.com/reference/android/app/Activity.html#on$p$ppareOptionsMenu%28android.view.Menu%29">on$p$ppareOptionMenu方法在你的片段类。
  

prepare屏幕的标准选项菜单显示。这是它显示每次叫右侧的菜单显示之前。可以使用此方法来有效地启用/禁用的物品或其他动态修改的内容。

那么,在这种方法中,尝试查找ID的菜单项,并使其可见/ unvisible,启用/禁用,像这样的:

  @覆盖
公共无效prepareOptionsMenu(功能菜单)在{
    menu.findItem(HERB_SPINNER_ID).setVisible(假).setEnabled(假);
    返回;
}
 

更多

I want to change the visibility of menu items of a fragment activity (abs) when ever I change the fragment in the activity. The fragments are SherlockListFragments.

The menu items I want to show/hide are spinners I create on menu creation:

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    MenuInflater inflater = getSupportMenuInflater();

    IcsSpinner herbSortSpinner = new IcsSpinner(this, null, R.attr.actionDropDownStyle);
    SpinnerAdapter herbSortSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.herb_sort_elements, android.R.layout.simple_spinner_dropdown_item);
    herbSortSpinner.setAdapter(herbSortSpinnerAdapter);
    herbSortSpinner.setOnItemSelectedListener(this);
    herbSortSpinner.setId(HERB_SPINNER_ID);
    menu.add(R.string.menu_sort).setActionView(herbSortSpinner).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

    IcsSpinner noteSortSpinner = new IcsSpinner(this,  null, R.attr.actionDropDownStyle);
    SpinnerAdapter noteSortSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.note_sort_elements, android.R.layout.simple_spinner_dropdown_item);
    noteSortSpinner.setAdapter(noteSortSpinnerAdapter);
    noteSortSpinner.setOnItemSelectedListener(this);
    noteSortSpinner.setId(NOTE_SPINNER_ID);
    menu.add(R.string.menu_sort).setActionView(noteSortSpinner).setVisible(false).setEnabled(false).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

    inflater.inflate(R.menu.activity_lexicon, menu);
    menuHolder.setMenu(menu);
    return true;
}

My logic for switching the fragments is:

public boolean onNavigationItemSelected(int position, long itemId) {

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    switch(position) {
    case 0:
        List<Herb> herbList = findHerbsByIntent(getHerbLocale());
        HerbListFragment herbListFragment = new HerbListFragment();
        herbListFragment.setListAdapter(new HerbListAdapter(this, getHerbLocale(), herbList));
        fragmentTransaction.replace(R.id.fragment_container, herbListFragment, HERB_LIST_FRAGMENT_TAG);
        //menuHolder.showHerbsSpinner();
        break;
    case 1:
        SymptomListFragment symptomListFragment = new SymptomListFragment();
        symptomListFragment.setListAdapter(new SymptomListAdapter(this, getDefaultSymptomLocale()));
        fragmentTransaction.replace(R.id.fragment_container, symptomListFragment, SYMPTOM_LIST_FRAGMENT_TAG);
        //menuHolder.showHerbsSpinner();
        break;
    case 2:
        NoteRepository noteRepository = new NoteRepository(this);
        List<Note> notes = noteRepository.getNoticables(ReferedType.HERB);
        NoteListFragment noteListFragment = new NoteListFragment();
        noteListFragment.setListAdapter(new NoteListAdapter(this, getHerbLocale(), notes));
        fragmentTransaction.replace(R.id.fragment_container, noteListFragment, NOTE_LIST_FRAGMENT_TAG);
        //menuHolder.showNotesSpinner();
        break;
    case 3:
        FavoriteRepository favoriteRepository = new FavoriteRepository(this);
        Set<Integer> favoriteHerbs = favoriteRepository.getFavorables(ReferedType.HERB);
        List<Herb> favoriteHerbList = herbRepository.getHerbsByIds(favoriteHerbs, getHerbLocale());
        FavoriteHerbListFragment favoriteHerbListFragment = new FavoriteHerbListFragment();
        favoriteHerbListFragment.setListAdapter(new HerbListAdapter(this, getHerbLocale(), favoriteHerbList));
        fragmentTransaction.replace(R.id.fragment_container, favoriteHerbListFragment, HERB_LIST_FRAGMENT_TAG);
        //menuHolder.showHerbsSpinner();
        break;
    }
    fragmentTransaction.commit();

    return true;
}

My first idea was to hold the menu object in a holder class and manipulate it there whenever I switch the fragment (in every case statement above).

static class MenuHolder {

    private Menu mMenu;

    void setMenu(Menu menu) {
        mMenu = menu;
    }

    void showNotesSpinner() {
        if (mMenu != null) {
            mMenu.findItem(HERB_SPINNER_ID).setVisible(false).setEnabled(false);
            mMenu.findItem(NOTE_SPINNER_ID).setVisible(true).setEnabled(true);
        }
    }

    void showHerbsSpinner() {
        if (mMenu != null) {
            mMenu.findItem(NOTE_SPINNER_ID).setVisible(false).setEnabled(false);            
            mMenu.findItem(HERB_SPINNER_ID).setVisible(true).setEnabled(true);
        }
    }
}

My problem is that there is no menu item with the given ID which are activity local constants. I get an NPE here. Does anybody have an idea how I can fix that? Is there a better way to change the menu on switching fragments?

Best regards Carsten

解决方案

Is there a better way to change the menu on switching fragments?

May be yes :).

The doc :

Report that this fragment would like to participate in populating the options menu by receiving a call to onCreateOptionsMenu(Menu, MenuInflater) and related methods.

Prepare the Screen's standard options menu to be displayed. This is called right before the menu is shown, every time it is shown. You can use this method to efficiently enable/disable items or otherwise dynamically modify the contents.

Then, in this method, try to find your menu items by ID, and make them visible/unvisible, enabled/disabled, like this :

@Override
public void onPrepareOptionsMenu(Menu menu) {    
    menu.findItem(HERB_SPINNER_ID).setVisible(false).setEnabled(false);
    return;
}

Read More

这篇关于Android的:改变可视性上的菜单项不断变化的片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆