1

多くの読んだgetActivity()はnull質問を返しますが、このシナリオに一致するものは見つかりません。DialogFragment getActivity()はフラグメントが他のデータを処理した後にnullを返します

私は、次の操作を行う必要がありますDialogFragmentを持っている:

  • 入力が正しいとだけ進んでいる場合ので
  • は、トランザクションは/にデータを書き込む作る場合/ダイアログを閉じ、ユーザー
  • 検証から入力してくださいFirebaseデータベース(これには1秒ほどかかります)
  • 新しいアクティビティに移動し、活動を終了します。

私はこれらのすべてを独立して稼働させることができますが、FBトランザクションの完了後にコードを新しいアクティビティに移動すると、startActivity()のインテントを設定するとNPEを取得します。

Firebaseトランザクションが発生している間は、AlertDialogとDialogFragmentが自動的に解除され、私の意図を設定するコンテキストを取得できなくなりました。

startActivity()を呼び出すための適切なアクティビティやコンテキストを取得するにはどうすればよいですか? ありがとう!私が言うことができるものから、

public class FinishedDialog extends DialogFragment { 

private String pushId; 

private AlertDialog alertDialog; 

public static FinishedDialog newInstance(String PushId) { 
    FinishedDialog frag = new FinishedDialog(); 
    Bundle args = new Bundle(); 
    args.putString("pushId", pushId); 
    frag.setArguments(args); 
    return frag; 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    pushId = getArguments().getString("pushId"); 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 

    builder.setView(inflater.inflate(R.layout.dialog_finished, null)) 
      .setPositiveButton(R.string.send_text_response, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        // This will be overridden for data validations 
       } 
      }) 
      .setNegativeButton(R.string.continue_without_response, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        finishListening(); 
       } 
      }) 
      .setNeutralButton(R.string.listen_again, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        //Dismisses Dialog 
       } 
      }); 
    return builder.create(); 
} 

//This is set up so that if user hasn't entered data, positiveButton won't dismiss dialog 
@Override 
public void onStart() { 
    super.onStart(); 

    alertDialog = (AlertDialog)getDialog(); 
    if(alertDialog != null) 
    { 
     Button positiveButton = alertDialog.getButton(Dialog.BUTTON_POSITIVE); 
     final EditText responseEditText = (EditText) alertDialog.findViewById(R.id.entered_response); 

     positiveButton.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Boolean wantToCloseDialog = false; 
       String enteredData = responseEditText.getText().toString(); 

       if (enteredData.length()>1) { 
        wantToCloseDialog = true; 
       } 

       if (wantToCloseDialog) { 
        alertDialog.dismiss(); //This line may be part of the problem, but I still get the NPE if I comment it out. 
        uploadResponseToFB(enteredData); 
       } else { 
        Toast.makeText(getContext(), "You didn't enter a response!", 
          Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
    } 
} 

private void uploadResponseToFB(String response) { 
    //Uploads some data to Firebase. 
    finishListening(); 
} 

private void finishListeningToStory() { 
    //This method does a number of firebase transactions and data writes 
    //The goBackToMainScreen() method is called onCompletion of the last data write. 
} 

private void goBackToMainScreen(){ 
    //Again, called onCompletion of last data write. 
    //This crashes on next line due to NPE from getActivity(), but when I test this exact code without the FB transactions (closer to onCreateDialog() or onStart()) it works fine. 
    Intent intent = new Intent(getActivity(), ConversationListActivity.class); 
    getActivity().startActivity(intent); 
    progressDialog.dismiss(); 
} 

} 

答えて

1

、Firebaseトランザクションが起こっている時間の間に、AlertDialogとDialogFragmentは自動的に却下されていないと私はもはや状況は私の意図を設定するために取得することができます。

AFAIKこれが正確な理由です。

ソリューション1

Activityホスティングに検証されたデータを渡し、そこfirebase書き込みを行います。このようにして、別のアクティビティを開始するためのコンテキストが常に得られます。あなたのfirebase書き込みが行われており、ConversationListActivityが開始されるまでの

ソリューション2

ProgressBarを表示)Dialogを閉じないでください。

+0

最初は解決策1を実行したかったが、データ検証が正しく機能するようにするのは苦労していた。私は 'DialogListener'を実装するそのルートに行くのが良いでしょうか?ソリューション2では、 'CongressationActivity'が開始されるまで 'ProgressDialog'スピナーを表示してアクティブにしてみましたが、同じエラーが発生しました。 – aterbo

+1

私は自分のコードを再構成し、検証されたデータをホスト 'Activity'に戻しました。これはうまくいった! – aterbo

関連する問題