9

방금 ​​ActionBarSherlock에서 ActionBarCompat로 전환했으며이 작은 오류가 발생할 때까지 모든 것이 잘 작동하고있었습니다. 나는 ActionBarActivity을 확장하고 그와 관련된 3 개의 단편을 가지고있는 기초 활동을 가지고있다. 내 화면 방향을 변경하려고 할 때까지Fragment (ActionBarCompat) 내부에서 getSupportActionBar()를 호출 할 때 NullPointerException이 발생했습니다.

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    final ActionBar actionBar = ((ActionBarActivity)activity).getSupportActionBar(); 

    actionBar.setHomeButtonEnabled(true); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setTitle(""); 
} 

그것은 잘 작동 : 조각 onAttach 방법 중 하나에서,이 코드를 실행하려고합니다. 그런 다음이 코드 줄에 NullPointerException이 표시됩니다 (actionBar.setHomeButtonEnabled(true);).

어떻게 해결할 수 있습니까?

편집 :

06-10 18:53:31.440: E/AndroidRuntime(18586): FATAL EXCEPTION: main 
06-10 18:53:31.440: E/AndroidRuntime(18586): Process: com.packagename.appname, PID: 18586 
06-10 18:53:31.440: E/AndroidRuntime(18586): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.packagename.appname/com.packagename.appname.activities.NewActivity}: java.lang.NullPointerException 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2328) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.access$1000(ActivityThread.java:169) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.os.Handler.dispatchMessage(Handler.java:102) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.os.Looper.loop(Looper.java:136) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.main(ActivityThread.java:5476) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at java.lang.reflect.Method.invokeNative(Native Method) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at java.lang.reflect.Method.invoke(Method.java:515) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at dalvik.system.NativeStart.main(Native Method) 
06-10 18:53:31.440: E/AndroidRuntime(18586): Caused by: java.lang.NullPointerException 
06-10 18:53:31.440: E/AndroidRuntime(18586): at com.packagename.appname.fragments.NewFragment.onAttach(NewFragment.java:144) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:883) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1879) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:215) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:97) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at com.packagename.appname.activities.NewActivity.onCreate(NewActivity.java:73) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.Activity.performCreate(Activity.java:5451) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292) 
06-10 18:53:31.440: E/AndroidRuntime(18586): ... 12 more 

FYI : actionBar.setHomeButtonEnabled : 144이다 NewFragment 선 여기

전체 에러 로그이다.

+0

게시물 오류가 그것의 단지 부분은 –

+0

@Rod_Algonquin 단지 ([이 게시물은 말했다] 게 아니에요 그 그것을 – lschlessinger

답변

8

onAttach()은 너무 이릅니다. 순환 게재 후 활동이 다시 작성되면 활동이 완전히 생성되기 전에 (즉, onCreate()이 아직 완료되지 않은 경우)라는 첫 번째 메소드 중 하나입니다. 따라서 ActionBar이 준비되지 않았다는 것은 놀라운 일이 아닙니다.

설명서의 relationship between Activity and Fragment's lifecycles을 확인하십시오.

요약하면이 코드를 onActivityCreated() 또는 onStart()으로 옮기십시오.

추가 설명

체크 ActionBarActivity 소스 코드 :

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    mImpl = ActionBarActivityDelegate.createDelegate(this); 
    super.onCreate(savedInstanceState); 
    mImpl.onCreate(savedInstanceState); 
} 
  • super.onCreate()FragmentActivity.onCreate()이며, 회전 후 이전의 단편을 복원한다.
  • mImpl.onCreate(savedInstanceState)은 으로, 창 스타일에서 변수 mHasActionBar을 읽습니다.
  • mHasActionBar이 true가되기 전에 getSupportActionBar()은 항상 null을 반환합니다.
+0

를 추가 http://stackoverflow.com/questions/18320713/getsupportactionbar-from-inside-of-fragment -actionbarcompat? rq = 1) ... – lschlessinger

+0

@lschessinger _first_'onAttach()'에서 작동합니다. 그러나 회전 후 아닙니다. 적어도 현재 버전의 지원 라이브러리를 사용하십시오. – matiash

+0

이것은 나를 위해 일했습니다. 유일한 변화는'activity'를'getActivity()'로 대체하는 것입니다. 감사! – lschlessinger

관련 문제