2017-04-17 3 views
-5

2フラグメント& 1アクティビティが含まれています。関連するコードスニペットとともに、問題を再現できるフローを次に示します。特定のフラグメントフローのgetContext()はNULLです

@ 1。 Frag1から、オープンFRAG2

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

ここBaseFragment.addToBackStack()2 @

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(); 
    } 

です。 Backを押してFrag1を再度開きます。

@ 3。 Frag1のアダプタからアクティビティA1をstartActivityForResult()で開きます。

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

4。 Frag1に戻るには、Backを押すか、A1を終了するか、 setResult()

@ 5のいずれかを入力します。 Frag1のonActivityResult()が呼び出されます。しかし、その内部では、getContext()getActivity()はNULLです。 A1がFrag1から直接開かれている場合

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); 
      } 
     } 

、そしてgetContext()startActivityForResult()内部nullでなく、完璧に動作します。

Logcat:

fragment.startActivityForResult(intent, Frag1.REQ_CODE_ISSUE_DONE); 

を使用して

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)  
+0

使用の代わりに 'のgetContext(の' getApplicationContext() ')' –

+0

は 'getApplicationContextを()'を使用することはできません。 'if(getActivity()instanceOf MainActivity){..}'を使用する必要があります。 –

+1

あなたのlogcatをポストして、ナビゲーションコード –

答えて

0

代わりの

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

は、問題を解決しました。

onActivityResult()内部のネストされたフラグメントは、サポートlib 23.2で呼び出されるようになりました。したがって、私が私のケースで行っていたように、onActivityResult()をActvityから手動でフラグメント化する必要はありません。

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

関連する問題