Android DialogFragment getActivity()在片段处理其他数据后返回null
我已经阅读了大量的Android DialogFragment getActivity()在片段处理其他数据后返回null,android,android-fragments,android-activity,firebase,android-dialogfragment,Android,Android Fragments,Android Activity,Firebase,Android Dialogfragment,我已经阅读了大量的getActivity()返回空问题,但我似乎找不到与此场景匹配的问题 我有一个对话框片段,它应该执行以下操作: 从用户那里获取输入 验证输入是否正确,如果正确,仅继续/关闭对话框 进行事务处理/将数据写入Firebase数据库(这需要一秒钟左右的时间) 移动到新活动并完成调用活动 我可以让所有这些部分独立工作,但如果我在FB事务完成后将代码移动到新活动中,我会在设置startActivity()intent时获得NPE 据我所知,在Firebase事务发生期间,Alert
getActivity()
返回空问题,但我似乎找不到与此场景匹配的问题
我有一个对话框片段
,它应该执行以下操作:
- 从用户那里获取输入
- 验证输入是否正确,如果正确,仅继续/关闭对话框
- 进行事务处理/将数据写入Firebase数据库(这需要一秒钟左右的时间)
- 移动到新活动并完成调用活动
startActivity()
intent时获得NPE
据我所知,在Firebase事务发生期间,AlertDialog和DialogFragment会自动关闭,我无法再获取上下文来设置我的意图
我如何获得适当的活动或上下文来调用startActivity()
?
谢谢
据我所知,在Firebase事务发生期间,AlertDialog和DialogFragment会自动关闭,我无法再获取上下文来设置我的意图
好吧,这就是确切的原因
解决方案1
将验证的数据传递到托管活动
,并在那里执行firebase写入。这样,您将始终拥有启动另一项活动的上下文
解决方案2
不要关闭
对话框
(显示进度条
),直到firebase写入完成并启动ConversationListActivity
。最初,我想执行解决方案1,但我很难让数据验证正常工作。实现“对话监听器”会更好吗?对于解决方案2,我尝试显示“ProgressDialog”微调器,并将其保持活动状态,直到“ConversationListActivity”启动,但出现了相同的错误。我重新构造了代码,将验证后的数据传递回宿主“Activity”。这成功了!
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();
}
}