Android DialogFragment:始终使用进度条执行空指针异常。如何解决?
考虑这个对话框片段:Android DialogFragment:始终使用进度条执行空指针异常。如何解决?,android,nullpointerexception,android-fragments,android-fragmentactivity,Android,Nullpointerexception,Android Fragments,Android Fragmentactivity,考虑这个对话框片段: public class RollTriggerDialog extends DialogFragment{ private ProgressDialog _dialog; int _progress; public Handler _progressHandler; public RollTriggerDialog() { // empty } @Override public Dialog o
public class RollTriggerDialog extends DialogFragment{
private ProgressDialog _dialog;
int _progress;
public Handler _progressHandler;
public RollTriggerDialog() {
// empty
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
_dialog = new ProgressDialog(getActivity());
this.setStyle(STYLE_NO_TITLE, getTheme());
_dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
_dialog.setProgress(0);
_progressHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (_progress >= 100) {
_dialog.dismiss();
} else {
_progress++;
_dialog.incrementProgressBy(1);
_progressHandler.sendEmptyMessageDelayed(0,100);
}
}
};
//_progressHandler.sendEmptyMessage(0); <- This uncommented would start the progress
return _dialog;
}
}
公共类RollTriggerDialog扩展了DialogFragment{
私有进程对话框;
国际进步;
公共处理程序(progressHandler);;
公共RollTriggerDialog(){
//空的
}
@凌驾
公共对话框onCreateDialog(最终捆绑包保存状态){
_dialog=newprogressdialog(getActivity());
this.setStyle(STYLE_NO_TITLE,getTheme());
_设置ProgressStyle(ProgressDialog.STYLE_水平);
_对话框。设置进度(0);
_progressHandler=新处理程序(){
公共无效handleMessage(消息消息消息){
超级handleMessage(msg);
如果(_进度>=100){
_dialog.dismise();
}否则{
_进步++;
_对话框。递增进度(1);
_progressHandler.sendEmptyMessageDelayed(0100);
}
}
};
//_progressHandler.sendEmptyMessage(0);出现NullPointerException
,因为findFragmentByTag
返回null
。解决方案是在使用findFragmentByTag
方法立即执行该片段事务之前调用fm.executePendingTransactions()
另外,处理程序
引用此时将为null
,因此您需要在片段的生命周期方法之一中初始化它,例如,onCreate
:
public static Handler _progressHandler; // should be made static
//...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_progressHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (_progress >= 100) {
_dialog.dismiss();
} else {
_progress++;
_dialog.incrementProgressBy(1);
_progressHandler.sendEmptyMessageDelayed(0, 100);
}
}
};
}
嗯,这似乎真的很棘手。有趣的是,我没有得到一张赞成票,Hanks Luksprog,今晚我将检查这是如何工作的。现在关于处理程序:你的意思是在OnCreate中初始化它,而不是像我在问题中那样在onCreateDialog中初始化它?作为补充,我认为你的声明将给出一个编译器错误,因为处理程序正在使用g非静态引用,如_dialog@quinestor您必须更早地初始化处理程序引用,因为活动
的onCreate
方法之后将调用onCreate对话框
(因此在此之前,您将有一个空的处理程序引用)。如果您将使用处理程序
类的实例作为字段初始化处理程序,那么您需要将其余字段声明为静态
。但是,当您使用非静态方法初始化处理程序引用时,您几乎可以保证在进入在方法上。我不太确定,所以您需要对它进行测试。是的,Luksprog,就是这样。将初始化移动到onCreate和executePndingTransactions(),我看到我必须阅读更多关于它的内容。+1对所有:)关于静态处理程序,这是另一个问题,我想我会解决的
public static Handler _progressHandler; // should be made static
//...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_progressHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (_progress >= 100) {
_dialog.dismiss();
} else {
_progress++;
_dialog.incrementProgressBy(1);
_progressHandler.sendEmptyMessageDelayed(0, 100);
}
}
};
}