对于某个片段流,getContext()为NULL

时间:2017-04-17 09:48:08

标签: android android-fragments

2片段&涉及1项活动。这是我能够重现问题的流程,以及相关的代码片段。

@ 1。从Frag1,打开Frag2

Frag2 fragment = Frag2.newInstance(pos);
BaseFragment.addToBackStack(getContext(), fragment);

这是BaseFragment.addToBackStack()

BaseFragment

public static void addToBackStack(Context context, BaseFragment fragment) {
        FragmentManager fragmentManager = ((BaseActivity) context).getSupportFragmentManager();
        android.support.v4.app.FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(BaseActivity.getContainerIdForCurrentActivity(context), fragment);
        transaction.addToBackStack(null).commit();
    }

@ 2。按返回再次打开Frag1。

@ 3。从Frag1中的适配器打开带有startActivityForResult()的活动A1。

    Intent intent = new Intent(context, Act1.class);
    intent.putExtra(..);
    intent.putExtra(..);
    ((BaseActivity) context).startActivityForResult(intent, Frag1.REQ_CODE_ISSUE_DONE);

@ 4。返回到Frag1,按返回或完成A1 setResult()

@ 5。调用Frag1的onActivityResult()。但在其中,getContext()getActivity()都是NULL。

Frag1

if (resultCode == Ac1.RESULT_CODE_OPEN_LANDING_SCREEN) {
            if (getActivity() instanceof MainActivity) {
                BaseFragment.replaceStack(getContext(), landingFrag.newInstance());
            } else {
                Intent intent1 = new Intent(getContext(), MainActivity.class);
                intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent1);
            }
        }

如果直接从Frag1打开A1,那么getContext()中的startActivityForResult()非空,并且运行正常。

logcat的:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=792, result=135, data=null} to activity {in.shadowfax.gandalf/in.shadowfax.gandalf.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
                                                                          at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
                                                                          at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
                                                                          at android.app.ActivityThread.-wrap16(ActivityThread.java)
                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                          at android.os.Looper.loop(Looper.java:148)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
                                                                          at android.content.ComponentName.<init>(ComponentName.java:128)
                                                                          at android.content.Intent.<init>(Intent.java:4449)
                                                                          at in.shadowfax.gandalf.help.issues.IssuesFrag.onActivityResult(IssuesFrag.java:153)
                                                                          at in.shadowfax.gandalf.help.HelpPresenter.triggerIssuesFragOnActivityResult(HelpPresenter.java:72)
                                                                          at in.shadowfax.gandalf.help.HelpFrag.onActivityResult(HelpFrag.java:100)
                                                                          at in.shadowfax.gandalf.MainActivity.onActivityResult(MainActivity.java:901)
                                                                          at android.app.Activity.dispatchActivityResult(Activity.java:6428)
                                                                          at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
                                                                          at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
                                                                          at android.app.ActivityThread.-wrap16(ActivityThread.java) 
                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
                                                                          at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                          at android.os.Looper.loop(Looper.java:148) 
                                                                          at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                          at java.lang.reflect.Method.invoke(Native Method) 
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

1 个答案:

答案 0 :(得分:0)

而不是

((BaseActivity) context).startActivityForResult(intent, Frag1.REQ_CODE_ISSUE_DONE);

使用

fragment.startActivityForResult(intent, Frag1.REQ_CODE_ISSUE_DONE);

解决了这个问题。

现在,在支持lib 23.2中调用嵌套片段中的

onActivityResult()。所以不需要像我在我的情况那样手动将onActivityResult()从Actvity重新路由到frag。

参考:https://inthecheesefactory.com/blog/onactivityresult-nested-fragment-support-library-v23.2/en