9

के अंदर से getSupportActionBar() को कॉल करते समय NullPointerException I ActionBarSherlock से ActionBarCompat पर स्विच किया गया और जब तक मैं इस छोटी त्रुटि में भाग नहीं लेता तब तक सबकुछ ठीक से काम कर रहा था। मेरे पास एक मूल गतिविधि है जो ActionBarActivity तक फैली हुई है और इसके साथ जुड़े 3 टुकड़े हैं।Frullment (ActionBarCompat)

@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 करें: NewFragment लाइन 144 है: actionBar.setHomeButtonEnabled

यहाँ पूरे त्रुटि लॉग है।

+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)ActionBarActivityDelegate.onCreate() है, जो विंडो शैली से mHasActionBar चर को पढ़ता है।
  • mHasActionBar से पहले सत्य है, getSupportActionBar() हमेशा शून्य वापस आ जाएगा।
+0

जोड़ा यही कारण है कि [इस पोस्ट ने कहा] नहीं है (http://stackoverflow.com/questions/18320713/getsupportactionbar-from-inside-of-fragment -actionbarcompat? rq = 1) ... – lschlessinger

+0

@lschessinger यह _first_ 'onAttach()' पर काम करेगा। लेकिन एक घूर्णन के बाद नहीं। कम से कम समर्थन पुस्तकालय के वर्तमान संस्करण के साथ। – matiash

+0

यह मेरे लिए काम किया। 'गतिविधि' को 'getActivity() 'के साथ बदलने के लिए एकमात्र परिवर्तन होगा। धन्यवाद! – lschlessinger

संबंधित मुद्दे