恢复 setActionBarTitle 问题时应用程序崩溃

App crashes when resuming setActionBarTitle issue

如果我的应用程序在后台运行了 15 - 20 分钟,每当我恢复它时它就会崩溃。罪魁祸首是我的 Viewfragment 中的这一行 ((MainActivity) getActivity()).setActionBarTitle("Stories");

该行在我的 MainActivity

中引用了此内容
public void setActionBarTitle(String title) {
        assert getSupportActionBar() != null;
        getSupportActionBar().setTitle(title);
    }

这是应用程序的外观..

MainActivity->>ViewFragment->> Fragment1 OR Fragment2.

每当我从 Fragment1 中的另一个 Activity 恢复应用程序时,然后按返回键转到 Fragment1,然后再次返回到 ViewFragment,它会崩溃,指向上面的行。日志如下:

我最好的猜测是 MainActivity 被长期杀死因此无法启动...我该如何解决这个问题?

java.lang.RuntimeException: 
Unable to start activity ComponentInfo{com.reelforge.utility/com.reelforge.utility.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
 at android.app.ActivityThread.access0(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
 at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
 at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.reelforge.utility.MainActivity.setActionBarTitle(MainActivity.java:155)
 at com.reelforge.utility.Viewfragment.ViewFragment.onCreate(ViewFragment.java:32)
at android.support.v4.app.Fragment.performCreate(Fragment.java:1939)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1029)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:2037)
at android.support.v4.app.FragmentController.dispatchCreate(FragmentController.java:154)
 at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:289)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:61)
 at br.liveo.navigationliveo.NavigationLiveo.onCreate(NavigationLiveo.java:112)
at android.app.Activity.performCreate(Activity.java:5231)

您应该使用接口在片段和活动之间进行交互(http://developer.android.com/intl/es/training/basics/fragments/communicating.html)。也是一种预防措施,就在 ((MainActivity) getActivity()).setActionBarTitle("Stories"); 之前,您应该检查重写是否为 -

if(isVisible()) {
((MainActivity) getActivity()).setActionBarTitle("Stories");
}

在您片段的简历中。

使用界面设置MainActivity的Title eg.

public interface ToolbarListener {
    void setTitle(String title);
}

像这样在您的 MainActiviy 中实现它

@Override
public void setTitle(String title) {
    if (getSupportActionBar() != null && !TextUtils.isEmpty(title)) {
        getSupportActionBar().setTitle(title);
    }
}

最后像这样在片段的 OnAttach() 中调用它

@Override
public void onAttach(Activity context) {
    super.onAttach(context);
    if (context instanceof ToolbarListener) {
        ((ToolbarListener) context).setTitle("My Title");
    }
}