Android : 활동 수명주기 중에 언제 onCreateOptionsMenu가 호출됩니까? 넣었다 onCreateOptionsMenu. onCreate방법은

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

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



답변

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

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

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

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


답변

안드로이드 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:


답변

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

invalidateOptionsMenu();

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

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


답변

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


답변

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

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


답변

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


답변