마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

onCreateOptionsMenu에 연결

0 추천
각 fragment마다 다른 actionbar 메뉴를

어떻게

onCreateOptionsMenu에 연결시키나요?

 

답변 감사합니다. ^^
목마른어린양 (960 포인트) 님이 2015년 11월 11일 질문

1개의 답변

0 추천
 
채택된 답변

fragment에도 onCreateOptionsMenu메소드가 있잖아요

거기에 그에 맞는 메뉴를 출력하도록 코딩해 넣으면 되는거죠

cc1232 (35,280 포인트) 님이 2015년 11월 11일 답변
목마른어린양님이 2015년 11월 12일 채택됨
기존 질문을 보시면 아시겠지만,
그렇게 하면 시간차가 발생합니다.
메뉴가 늦게 바뀌어요...

addOnPageChangeListener를 이용해서 Actionbar는 변경할 수 있을거 같은데
메뉴는 어떻게 변경할지 모르겠네요.
카톡 UI 같은 형태에 액션바 메뉴를 변경하는 것은 만들어보지 않아서 말씀하시는 시간차를 정확히 알 수는 없습니다만, 액션바의 텍스트가 바뀌는 시간과 메뉴가 바뀌는 시간이 달라서 늦다고 느끼신다면 액션바 텍스트를 메뉴 생성될 때 바뀌도록 하면 되지 않을까요?
addOnPageChangeListener에 텍스트를 변경하는 코딩을 넣으면
시간차없이 잘 바뀝니다.

근데 이 리스너를 이용해서 각 탭의 액션바 메뉴는
어떤 식으로 바꿔야 할지 모르겠네요.

답변 감사합니다.
https://play.google.com/store/apps/details?id=com.astuetz.android.adia
이 어플이 fragment menu가 적용된 어플입니다.
제가 얘기한 시간차가 궁금하시다면
이 어플로 시간차를 느끼실 수 있을 거예요.

카톡과 비교해보세요.
개인메일을 자주 확인하지 않다보니 이제 봤네요.
액션바를 변경할 수 있다고 하셨는데, 그때 메뉴를 변경하시면 됩니다.
예를 들어 OnPageChangeListener의 onPageSelected메소드에서 아래 메소드를 호출해주세요
    private void changeOptionMenu(int i) {
        ActionBar ab = getSupportActionBar();
        if (i%2 == 0) {
            ab.setTitle("Setting");
        } else {
            ab.setTitle("test");
        }
        if (mMenu != null) {
            mMenu.clear();
            if (i%2 == 0) {
                getMenuInflater().inflate(R.menu.menu_main, mMenu);
            } else {
                getMenuInflater().inflate(R.menu.menu_main1, mMenu);
            }
        }
    }
mMenu는 onCreateOptionMenu 가 호출되었을 때, 메뉴값을 넣은 변수구요
저렇게 하면 액션바 제목도, 액션메뉴도 변경됩니다. (예제는 즉흥적으로 만들어서 개발새발이라 죄송)
mMenu 변수가 이해가 되질 않네요.
어디에 전역변수로 선언하고 나서 어디에서 Menu의 내용을 받아와야 하나요?

처음에 콜백으로 onCreateOptionMenu의 인자menu는 안드로이드가 알아서 불러오는데
그 menu부분을 저 mMenu에 넣어주라는 말씀아니신가요?

Menu와 mMenu가 연결되는 시점이 어디인가요?

전역변수로 선언하고 초기화는 안 해도 되나요?

제 능력선에서 이것저것 다 시도해 보았는데
mMenu가 이해가 되질 않네요.

getMenuInflater()를 이용해야 된다고 생각했는데
Menu인자를 어떻게 줘야 할지 몰라서 포기했었는데.

이 부분만 알려주시면 제대로 구현할 수 있을 것 같습니다.


늦게라도 답변을 계속 주시니 감사할 따름입니다.
복 받으실 거예요. ^^
mMenu는 사용하시는 액티비티(ViewPager를 포함한 곳)에 private Menu mMenu; 이런 식으로 선언하시면 됩니다.

액티비티의 onCreateOptionMenu메소드에서 mMenu = menu; 해주시면 되구요.(기존 메뉴 인플레이트 하는 부분은 그대로 냅두고요)
초기화는 별 의미가 없을 것 같아서 안했습니다. 대신 null이면 해당부분 실행되지 않게 하구요.
대단히 감사합니다.
말씀하신대로 하니 구현이 잘 됩니다.
정말 감사합니다.
다음에도 답변 해 주시길.. ^^
...