나는 두 개의 중단 점을 onCreate
(시작 부분과 하나는 메소드의 끝 부분에) 넣었고 또한 하나를 시작 부분에 넣었다 onCreateOptionsMenu
. onCreate
방법은 먼저 호출하고,이 완료 전에한다 onCreateOptionsMenu
라고합니다.
Fragment
내 앱에서 탐색 코드 를 분리하려고하는데 onCreateOptionsMenu
앱이 휴대 전화 / 태블릿에서 실행 중인지에 따라 위임해야 할 몇 가지 객체가 있습니다 (화면 크기를 사용하여이를 결정합니다. 큰 화면에는 레이아웃이 팽창 된 후 확인하는보기가 있습니다). 내가 겪고있는 문제는 onCreate에서 이러한 객체를 만들고에서 객체를 참조 할 때 null 포인터 예외가 발생한다는 것입니다 onCreateOptionsMenu
.
답변
onCreate 메소드가 먼저 호출되고 완료되기 전에 onCreateOptionsMenu가 호출됩니다.
공식적인 Honeycomb 스타일 작업 표시 줄이있는 장치 및 앱에서는 마찬가지입니다. 작업 표시 줄이없는 경우 onCreateOptionsMenu()
사용자가 일반적으로 메뉴 버튼을 눌러 메뉴를 불러올 때까지 호출하지 않아야합니다.
(이를 결정하기 위해 화면 크기를 사용하고 있습니다. 대형 화면의 레이아웃 파일에는 레이아웃이 팽창 된 후 확인하는보기가 있습니다)
Ice Cream Sandwich가 출시되면 테스트가 곧 중단됩니다. 내가 알 수 있듯이 ICS 전화에는 작업 표시 줄이 있습니다 (시스템 표시 줄은 아님).
답변
안드로이드 2.3 및 FragmentActivity
v4 지원 라이브러리에서 라이프 사이클 메소드 호출 순서는 다음과 같습니다.
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 ()의 타이밍 문제를 피하기 위해 프래그먼트에 콜백 함수를 만드는 것이 좋습니다.
다음을 수행하면 완벽하게 작동합니다.
- 활동에 조각을 작성하고 추가하십시오.
- 활동 에이 조각에 대한 참조를 남겨 두십시오.
- 조각에 공개 메소드 doSomethingWithTheMenu ()를 작성하십시오.
- onCreateOptionsMenu (Menu menu)가 호출 될 때 활동 내에서이 메소드를 호출하십시오.
예:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (this.myFragment != null) {
this.myFragment.doSomethingWithTheMenu(menu);
}
return true;
}