多くの読んだ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を実行したかったが、データ検証が正しく機能するようにするのは苦労していた。私は 'DialogListener'を実装するそのルートに行くのが良いでしょうか?ソリューション2では、 'CongressationActivity'が開始されるまで 'ProgressDialog'スピナーを表示してアクティブにしてみましたが、同じエラーが発生しました。 – aterbo
私は自分のコードを再構成し、検証されたデータをホスト 'Activity'に戻しました。これはうまくいった! – aterbo