DialogFragment在show()之后调用onCreateDialog()

时间:2013-11-19 08:17:35

标签: android dialogfragment

我有一个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。

1 个答案:

答案 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();
}