2012-07-07 4 views
7

ActionBar에 일부 단편 메뉴 항목을 설정하는 데 문제가있어서 해결 방법을 찾았지만 왜 효과가 있었는지 이해할 수 없습니다. 조각의 onCreateOptionsMenu 대신 onPrepareOptionsMenu 사용

은 내가 onCreateOptionsMenu 방법에서 메뉴 XML 파일에서 그것을 팽창 후 바로 메뉴 항목의 가시성을 변경을 원했습니다. 코드는 정상적으로 작동하지만 눈에 띄는 효과는 없습니다. 나는 onCreateOptionsMenu 방법에있는 메뉴를 팽창시키는 문제를 해결했다 그러나 그것의 시정을 onPrepareOptionsMenu 방법에서 바꾸기. onCreateOptionsMenu의 가시성이 작동하지 않습니다 변화하는 이유를 알고 싶은 무엇

이다.

내가 할 수없는 onPrepareOptionsMenu에서 무엇을 할 수 있습니까? onCreateOptionsMenu?

여기에 따라야 할 패턴이 있습니까?

감사합니다.

여기 단지의 경우, 관련 코드입니다 :

public class MyFragment extends Fragment { 

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

     // This does not work, compiles and runs fine, but has no visible effect 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     // This does work 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 
} 
+1

잘 모르겠어요 시도를 위해 작동하지만 [문서] (http://developer.android.com/reference/android/app/Activity. html # onCreateOptionsMenu (android.view.Menu))는 다음과 같이 말합니다. "_ ... 메뉴가 표시 될 때마다 업데이트하려면 [onPrepareOptionsMenu (Menu)] (http://developer.android.com/reference/android/app/)를 참조하십시오. Activity.html # onPrepareOptionsMenu (android.view.Menu)) ._ " –

+1

댓글을 주셔서 감사합니다!/팽창 만들 때 여기 것은 내가 (이 더 submenues이없는, 모든 시간이 표시되는), 난 그냥 한 번만 메뉴를 구성 할 '그것이 표시 될 때마다 업데이트'할 필요가 없습니다 것입니다, 그게 다야 . 좋아, 내 상황에서 똑같은 것처럼 보일지 모르지만 내 질문의 요점은 왜 이런 식으로 작동하는지 이해합니다. 메뉴를 만들 때 한번만 표시 할 때마다 메뉴를 '다시 구성'해야합니까? –

+0

본인은 옵션이어야한다는 점을 이해하고 이에 동의합니다. 그러나 제 의견으로는 안드로이드가 작동하는 방식이라고 생각합니다. 경우에 따라 xml 속성을 사용하여 메뉴의 속성을 하드 코딩 할 수 있습니다. –

답변

5

당신은 super.onCreateOptionsMenu(menu, inflater);를 호출해야합니다. 이것은 계층 구조와 다른 단편에서 메뉴를 보내거나 활동이 항목을 직접 추가하려고 할 수 있습니다.

활동은 표시하고 메뉴를 관리하는 책임이있다, 그래서 당신은 가시성을 변경할 경우가 많은 것도이 일어날되지 않은 활동에 전송 한 후.

이제 super.onPrepareOptionsMenu(menu);으로 전화하면 메뉴를 준비하지만 onCreateOptionsMenu에서 변경 한 사항을 고려합니다.

+1

nice - 당신이 옳다는 이유로이 줄을 제거하십시오. "_I 생각한다." – Elltz

+0

완료 - 감사합니다. – Christian

0

코드가 메뉴를 볼 수 있도록 true를 돌려 수있다, 그건 당신이 onCreateOptionsMenu()onPrepareOptionsMenu() 모두 return true; 문을 넣어해야 의미합니다.

희망이 도움이됩니다.

+5

onCreateOptionsMenu는 void – Axarydax

+1

을 반환합니다. 사실 두 개의 onPrepareOptions() 메소드가 있습니다. Activity 클래스의 [first] (http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu (android.view.Menu))는 값을 반환합니다. true가 아닌 경우 메뉴가 표시되지 않습니다. [Fragment] (http://developer.android.com/reference/android/app/Fragment.html#onPrepareOptionsMenu (android.view.Menu)) 버전은 그렇지 않습니다. 단편 버전에는 활동 버전에 API 11 vs API 1이 필요합니다. 흥미로운 일의 종류. – fattire

0

나는 메뉴의 항목이 활성화되어야하며, 어떤 사람은 활동의 현재 상태에 따라/회색 제거해야하는 업데이트 할 onPrepareOptionsMenu를 사용합니다. 메뉴 항목의 setVisible 메서드를 사용하여 현재 메뉴에 표시되는지 여부를 제어합니다. 당신이하지 전에, 메뉴를 생성 한 후

-2

이 날

public class ContentFragment extends android.support.v4.app.Fragment { 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.content_frame,container,false); 
    setHasOptionsMenu(true); 
    return v; 
} 

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

이 그것을

+0

이 일은 나를 위해 작동하지만 동적 변경을 위해 invalidateoptionsmenu() 메서드를 사용하는 방법을 알고 싶습니다 –

+0

다이내믹 메뉴 업데이트에 관한 코드가 있으면 plz에 알려주세요. –