2013-01-18 2 views
9

활동의 단편을 변경하면 조각 활동 (abs)의 메뉴 항목 표시 여부를 변경하고 싶습니다. 조각은 SherlockListFragments입니다.Android : 조각 변경으로 메뉴 항목의 가시성 변경

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

조각 전환에 대한 나의 논리는 다음과 같습니다 :

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

내 첫번째 생각은를 개최했다 내가/숨기기를 표시 할

메뉴 항목은 스피너 I 메뉴 생성에 만들 수 있습니다 메뉴 객체를 홀더 클래스에 저장하고 조각을 바꿀 때마다 조작합니다 (위의 모든 문에서).

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

내 문제는 주어진 로컬 ID를 가진 메뉴 항목이 활동 로컬 상수라는 것입니다. 나는 여기에 NPE를 얻는다. 아무도 내가 그걸 고칠 수있는 아이디어가 있니? 프래그먼트를 전환 할 때 메뉴를 변경하는 더 좋은 방법이 있습니까?

안부 카슨

+0

어제 나에게 도움이되었습니다. 나는 복잡한 코드를 정리하고 (onCreate에서 단편을 한 번만 설치 함) 메뉴 항목을 홀더에 직접 저장했습니다. 이제 그것은 매력처럼 작동합니다. – modebm

답변

20

는 조각 전환에 메뉴를 변경하는 더 좋은 방법이 있나요?

예 예 :). 당신의 조각 onCreate에서

기타 문서 :

신고 조각에 의해 옵션 메뉴를 채우기에 참여하고 싶다고 onCreateOptionsMenu (Menu, MenuInflater) 및 관련 메서드에 대한 호출 수신.

표시 할 화면의 표준 옵션 메뉴를 준비하십시오. 이것은 메뉴가 나타날 때마다 호출됩니다. 이 방법을 사용하면 항목을 효율적으로 활성화/비활성화하거나 동적으로 내용을 수정할 수 있습니다.

그런 다음,이 방법 이와 같이, ID하여 메뉴 항목을 찾기 위해 노력하고, 활성화/비활성화, 그들/볼 unvisible합니다

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

Read More

+3

이 답변은 더 많은 upvotes받을 가치가있어. 그러나 PreferenceFragment에서 필요한 재정의 해체는 다음과 같습니다. public void onPrepareOptionsMenu (메뉴 메뉴) {/*..*/} 그럼에도 불구하고 많은 일을 절약 할 수있었습니다. 감사. :) –

+1

도 나를 도왔습니다. 감사합니다. mMenu가 메뉴 여야하며, 무효이므로 아무 것도 반환하지 말아야합니다. – fizgig

+0

감사합니다. @fizgig. 답변 된 편집 : –

0

를 내 경우에는 , 나는 다른 메뉴 아이템을 가지고있는 2 개의 단편을 가지고있다.내 MainActivity에

:

FragmentA fragmentA = new FragmentA(); 
fragmentA.setTargetFragment(fragmentA, 0); 
FragmentB fragmentB = new FragmentB(); 
fragmentB.setTargetFragment(fragmentB, 1); 

및 FragmentA 및 FragmentB가 있습니다

@Override 
public void onHiddenChanged(boolean hidden) { 
    super.onHiddenChanged(hidden); 
    if(hidden) { 
     getTargetFragment().setMenuVisibility(false); 
    }else{ 
     getTargetFragment().setMenuVisibility(true); 
    } 
} 

이 B가 떠날 때 조각 A로부터 메뉴를 볼 수있게된다. B에서 A로 이전 메뉴가 표시 될 수 있습니다.

참조 : here

관련 문제