Android : 활동 수명주기 중에 언제 onCreateOptionsMenu가 호출됩니까?


149

나는 두 개의 중단 점을 onCreate(시작 부분과 하나는 메소드의 끝 부분에) 넣었고 또한 하나를 시작 부분에 넣었다 onCreateOptionsMenu. onCreate방법은 먼저 호출하고,이 완료 전에한다 onCreateOptionsMenu라고합니다.

Fragment내 앱에서 탐색 코드 를 분리하려고하는데 onCreateOptionsMenu앱이 휴대 전화 / 태블릿에서 실행 중인지에 따라 위임해야 할 몇 가지 객체가 있습니다 (화면 크기를 사용하여이를 결정합니다. 큰 화면에는 레이아웃이 팽창 된 후 확인하는보기가 있습니다). 내가 겪고있는 문제는 onCreate에서 이러한 객체를 만들고에서 객체를 참조 할 때 null 포인터 예외가 발생한다는 것입니다 onCreateOptionsMenu.

답변:


112

onCreate 메소드가 먼저 호출되고 완료되기 전에 onCreateOptionsMenu가 호출됩니다.

공식적인 Honeycomb 스타일 작업 표시 줄이있는 장치 및 앱에서는 마찬가지입니다. 작업 표시 줄이없는 경우 onCreateOptionsMenu()사용자가 일반적으로 메뉴 버튼을 눌러 메뉴를 불러올 때까지 호출하지 않아야합니다.

(이를 결정하기 위해 화면 크기를 사용하고 있습니다. 대형 화면의 레이아웃 파일에는 레이아웃이 팽창 된 후 확인하는보기가 있습니다)

Ice Cream Sandwich가 출시되면 테스트가 곧 중단됩니다. 내가 알 수 있듯이 ICS 전화에는 작업 표시 줄이 있습니다 (시스템 표시 줄은 아님).


ActionbarSherlock 라이브러리를 사용하고 있다고 언급하는 것을 잊었습니다. 당신의 대답은 나에게 상기시켰다. 호환성 라이브러리의 래퍼이기 때문에 메뉴 항목을 "ActionBar"에 배치하기 때문에이 동작의 이유 일 수 있습니다.
Christopher Perry

@commonsware-작업 표시 줄이없는 장치 및 앱에 적용됩니다. onCreateOptionsMenu에 항목이 보이지 않더라도 메뉴가 표시됩니까?
NinjaCoder

12
onResume 후 내 경우 onCreateMenu 통화에서
티아 Khuta

1
예, 같은 문제가 있습니다 ...하지만 내 코드는 조각과 관련이 있습니다.
Yoann Hercouet

에서 열려 NPE있는지 확인할 때 시작 nav drawer fragment했습니다 onCreateOptionsMenu. 액티비티의 onCreateOptionsMenu와 조각이 onCreateOptionsMenu에서 사용하고있는 콜백 모두에서 null 검사를 수행해야했습니다. 두 화면에서만 발생했지만 일관되게 화면에서 발생했기 때문에 정말 이상합니다.
theblang 2016 년

54

안드로이드 2.3 및 FragmentActivityv4 지원 라이브러리에서 라이프 사이클 메소드 호출 순서는 다음과 같습니다.

07-18 18:29:21.629  20183-20183/? I/onCreate:
07-18 18:29:21.719  20183-20183/? I/onStart: 
07-18 18:29:21.719  20183-20183/? I/onResume: 
07-18 18:29:21.739  20183-20183/? I/onCreateOptionsMenu:

27

onResume ()에서 전화하면 찾았습니다.

invalidateOptionsMenu();

그런 다음 @ tir38에 표시된 것처럼 활동 수명주기에 따라 onCreateOptionsMenu (메뉴 메뉴)가 호출됩니다 (여기서 올바른 용어라고 생각합니다) .

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}

4
만약 당신이 supportInvalidateOptionsMenu();
actionbarsherlock을

3
"즉시"라고 말할 때주의하십시오. 실제로 즉시 발생하지는 않습니다. 의 invalidateOptionsMenu경우 옵션 메뉴를 다시 생성하는 작업이 UI의 메시지 대기열에 추가됩니다. 대기열에있는 다른 항목이 먼저 실행됩니다.
tir38

21

위의 답변에 추가, ICS 및 Honeycomb의 경우 onCreate 및 onPostCreate 이후에 onCreateOptionsMenu가 호출되고 Gingerbread 및 이전 버전에서는 onCreate 이후에 onPostCreate 전에 호출됩니다. 그게 내가 찾은 유일한 차이점입니다.


3

중간 에 메소드에서 호출 된 ActionBarActivity지원 v7의 경험 에 따르면 4.1.1에 나타납니다.onCreateOptionsMenu()setContentView()onCreate()

그러나 4.4에 또 다른 이야기 onCreateOptionMenu()가 이어졌습니다 onCreate(). 또한 나는 그것이 바로 직후 일지 모른다. 그러나 사실입니다. 다른 버전에서는 테스트하지 않았지만 4.1.1이 처음으로 init 순서에 문제가있었습니다.


아마도 당신은 사용해야 supportInvalidateOptionsMenu()합니까?
David d C e Freitas

2

onResume () 및 onCreateOptionsMenu ()의 타이밍 문제를 피하기 위해 프래그먼트에 콜백 함수를 만드는 것이 좋습니다.

다음을 수행하면 완벽하게 작동합니다.

  1. 활동에 조각을 작성하고 추가하십시오.
  2. 활동 에이 조각에 대한 참조를 남겨 두십시오.
  3. 조각에 공개 메소드 doSomethingWithTheMenu ()를 작성하십시오.
  4. onCreateOptionsMenu (Menu menu)가 호출 될 때 활동 내에서이 메소드를 호출하십시오.

예:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.