我有一个DialogFragment,它有一个ProgressBar:
public class DialogFragmentProgress extends DialogFragment {
final static String DTAG = "FileCmd";
View v;
ProgressBar pb = null;
TextView tv = null;
public void setMsg(String msg){
Log.d(DTAG,"ProgressBar: setMsg("+msg+")");
if (tv != null){
Log.d(DTAG,"ProgressBar: (tv != null)");
tv.setText(msg);
}else{
Log.d(DTAG,"ProgressBar: (tv == null)");
}
}
public void setProgress(int progress){
Log.d(DTAG,"ProgressBar: setProgress("+progress+")");
if (pb != null){
Log.d(DTAG,"ProgressBar: (pb != null)");
pb.setProgress(progress);
Log.d(DTAG,"ProgressBar: getProgress() return "+pb.getProgress());
}else{
Log.d(DTAG,"ProgressBar: (pb == null)");
}
}
public static DialogFragmentProgress newInstance() {
DialogFragmentProgress fragment = new DialogFragmentProgress();
Log.d(DTAG,"ProgressBar: DialogFragmentProgress.newInstance()!");
return fragment;
}
public DialogFragmentProgress() {
// TODO Auto-generated constructor stub
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
v = inflater.inflate(R.layout.progressbar, null);
builder.setView(v)
.setTitle(R.string.progress_prompt)
.setNegativeButton(R.string.negative, null);
tv = (TextView)v.findViewById(R.id.progressbar_text);
pb = (ProgressBar)v.findViewById(R.id.progressbar);
pb.setMax(100);
pb.setProgress(10);
Log.d(DTAG,"ProgressBar: DialogFragmentProgress.onCreateDialog()!");
return builder.create();
}
}
在MainActivity中:
DialogFragmentProgress dfp = new DialogFragmentProgress();
dfp.show(getSupportFragmentManager(), "");
dfp.setProgress(50);
dfp.setMsg(srcFile.getName());
日志输出:
11-19 01:42:57.744: D/FileCmd(2095): ProgressBar: setProgress(50)
11-19 01:42:57.744: D/FileCmd(2095): ProgressBar: (pb == null)
11-19 01:42:57.744: D/FileCmd(2095): ProgressBar: setMsg(.qm_guid)
11-19 01:42:57.744: D/FileCmd(2095): ProgressBar: (tv == null)
11-19 01:42:59.494: D/FileCmd(2095): ProgressBar: DialogFragmentProgress.onCreateDialog()!
请查看时间,这意味着onCreateDialog()会在稍后调用!所以我不能得到电视和pb。有什么问题?我需要立即显示Dialog,然后我可以设置ProgressBar。
答案 0 :(得分:3)
有什么问题?
片段事务是异步的,因此在您的代码中,只有在您进行show()
调用的代码/方法将返回时,片段的对话框才可用。在getSupportFragmentManager().executePendingTransaction()
调用后尝试使用show()
,或者更好的是,更改当前代码,以便setProgress()
和setMsg()
存储传入的值(并更新视图,如果它们是可用),然后在onCreateDialog()
回调中创建对话框时使用这些值。
编辑:
public class DialogFragmentProgress extends DialogFragment {
final static String DTAG = "FileCmd";
private String mMsg;
private int mCurProgress = -1;
public void setMsg(String msg) {
mMsg = msg;
// if we also have the view available update it
if (pb != null){
//... current code
}
public void setProgress(int progress){
mCurProgress = progress;
// if we also have the view available update it
if (pb != null){
// ... current code
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// current code...
// if mMsg and mCurProgress are valid it means they were set before the fragment's dialog
// was created so we need to use them at this moment
if (mMsg != null) {
// we have a valid message so use it at this moment to set the text
tv.setText(mMsg);
}
if (mCurProgress != -1) {
// we have a valid progress so use it at this moment to set the progress
pb.setProgress(mCurProgress);
}
return builder.create();
}