更新显示的对话框

Updating a shown Dialog

我使用自定义布局创建了 Dialog

public class WaitDialog extends DialogFragment {
    [..]
    @SuppressLint("InflateParams")
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View viewDlg = inflater.inflate(R.layout.dialog_finish, null);
        tvStatusMain = (TextView) viewDlg.findViewById(R.id.tvStatusMain);
        [..]
    }
    public void setMessage(String message) {
        tvStatusMain.setText(message);
    }
}

这段代码工作正常,但是当我像这样实例化 Dialog 时:

flexWaitDialog = new WaitDialog();
flexWaitDialog.setCancelable(false);
flexWaitDialog.show(this.getFragmentManager(), "login");

然后尝试更新消息:

flexWaitDialog.setMessage(getString(R.string.initialising));

它显示了布局中的默认字符串。但是,当我使用 Handler:

new Handler().post(new Runnable() {
    @Override
    public void run() {
        flexWaitDialog.setMessage(getString(R.string.initialising));
    }
});

它确实有效。这种跳圈有理由吗?如果没有,有没有更好的方法?

我认为,onResumeonCreateDialog 之前调用。

您可以修改您的 class 来处理:

public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            LayoutInflater inflater = getActivity().getLayoutInflater();
            View viewDlg = inflater.inflate(R.layout.dialog_finish, null);
            tvStatusMain = (TextView) viewDlg.findViewById(R.id.tvStatusMain);
            if (mMessage != null) {
                tvStatusMain.seText(mMessage);
            }
            mViewCreated = true;
            [..]
        }

        public void setMessage(String message) {
            if (mViewCreated) {
                tvStatusMain.setText(message);
            } else {
                mMessage = message
            }           
        }