Android上的AlertDialog问题
我在试图显示自定义内容时遇到了一些奇怪的UI问题Android上的AlertDialog问题,android,android-alertdialog,dialogfragment,Android,Android Alertdialog,Dialogfragment,我在试图显示自定义内容时遇到了一些奇怪的UI问题AlertDialog。该对话框要求用户输入一个名称,但不允许用户在不输入名称的情况下继续前进。这也是用户在活动开始时看到的第一件事 有时,在应用程序重新启动后—比方说,当对话框打开时,我按home按钮,然后重新打开应用程序,AlertDialog将按应有的方式显示,但父活动的布局未正确加载。它实际上保留了用户看到的上一个活动的布局。更奇怪的是,这种布局几乎总是向后显示。你也许可以从中更好地看到这一点。在对话框后面应该是一个空白的白色布局,但是有一
AlertDialog
。该对话框要求用户输入一个名称,但不允许用户在不输入名称的情况下继续前进。这也是用户在活动开始时看到的第一件事
有时,在应用程序重新启动后—比方说,当对话框打开时,我按home按钮,然后重新打开应用程序,AlertDialog
将按应有的方式显示,但父活动的布局未正确加载。它实际上保留了用户看到的上一个活动的布局。更奇怪的是,这种布局几乎总是向后显示。你也许可以从中更好地看到这一点。在对话框后面应该是一个空白的白色布局,但是有一个从设置应用程序还原的启动器活动“快照”
正如官方文档所示,我正在将AlertDialog
包装在DialogFragment
中
public class NicknamePickerDialog extends DialogFragment {
public static final String TAG = NicknamePickerDialog.class.getSimpleName();
public interface NicknameDialogListener {
void onNicknamePicked(String nickname);
void onPickerCanceled();
}
private NicknameDialogListener mListener;
private EditText mNicknameEditText;
private Button mPositiveButton;
public void setNicknameDialogListener(NicknameDialogListener listener) {
mListener = listener;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Set the title
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.pick_nickname);
// Inflate the custom content
View dialogView = getActivity().getLayoutInflater().inflate(R.layout.nickname_dialog_layout, null);
builder.setView(dialogView);
mNicknameEditText = (EditText) dialogView.findViewById(R.id.nickname);
builder.setPositiveButton(R.string.great, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (mListener != null) {
mListener.onNicknamePicked(mNicknameEditText.getText().toString());
}
}
});
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (mListener != null) {
mListener.onPickerCanceled();
}
}
});
final AlertDialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialogInterface) {
mPositiveButton = dialog.getButton(Dialog.BUTTON_POSITIVE);
mPositiveButton.setEnabled(false);
}
});
mNicknameEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void afterTextChanged(Editable s) {
mPositiveButton.setEnabled(s.length() != 0);
}
});
return dialog;
}
}
这是活动
代码
public class ChatActivity extends Activity implements NicknamePickerDialog.NicknameDialogListener {
private String mNickname;
private TextView mWelcomeTextView;
private NicknamePickerDialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chat_activity_layout);
mWelcomeTextView = (TextView) findViewById(R.id.welcome);
mDialog = new NicknamePickerDialog();
mDialog.setNicknameDialogListener(this);
}
private void showNicknamePickerDialog() {
mDialog.show(getFragmentManager(), NicknamePickerDialog.TAG);
}
@Override
public void onNicknamePicked(String nickname) {
mNickname = nickname;
mWelcomeTextView.setText("Welcome " + nickname + "!");
}
@Override
public void onPickerCanceled() {
if (mNickname == null) {
finish();
}
}
@Override
protected void onResume() {
super.onResume();
if (mNickname == null) {
showNicknamePickerDialog();
};
}
@Override
protected void onPause() {
super.onPause();
mDialog.dismiss();
}
}
起初我怀疑这可能是因为我在活动的
onCreate()
回调中调用了DialogFragment
的show
方法(因为可能太早了),但将其延迟到onResume()
并不能解决问题。方向更改时也会出现此问题,使对话框后面的背景变为黑色。我肯定我做错了什么,但我真的不知道那是什么。我真的不明白你想做什么。但有一件事你做错了,那就是
在类昵称PickerDialog中执行overide方法OnCreateView(),并执行以下操作
// Inflate the custom content
View dialogView = getActivity().getLayoutInflater().inflate(R.layout.nickname_dialog_layout, null);
builder.setView(dialogView);
mNicknameEditText = (EditText) dialogView.findViewById(R.id.nickname);
mNicknameEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void afterTextChanged(Editable s) {
mPositiveButton.setEnabled(s.length() != 0);
}
});
return dialogView;
此外,您的警报对话框将无法工作。更好地在onCreateDialog()中创建按钮和标题
setTitle(R.string.pick_昵称)
希望这能奏效。我真的不明白你想做什么。但有一件事你做错了,那就是 在类昵称PickerDialog中执行overide方法OnCreateView(),并执行以下操作
// Inflate the custom content
View dialogView = getActivity().getLayoutInflater().inflate(R.layout.nickname_dialog_layout, null);
builder.setView(dialogView);
mNicknameEditText = (EditText) dialogView.findViewById(R.id.nickname);
mNicknameEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void afterTextChanged(Editable s) {
mPositiveButton.setEnabled(s.length() != 0);
}
});
return dialogView;
此外,您的警报对话框将无法工作。更好地在onCreateDialog()中创建按钮和标题
setTitle(R.string.pick_昵称)
希望这能起作用。我真的尽了最大努力解释了这个问题,我真诚地认为,为了清楚地理解正在发生的事情,您不必多次阅读代码。我使用的是
Fragment
的子类,专门用于处理对话框,根据,这是正确的方法。此外,对话框本身也可以工作!我真的尽了最大的努力来解释这个问题,我真诚地认为,为了清楚地理解正在发生的事情,您不必多次阅读代码。我使用的是Fragment
的子类,专门用于处理对话框,根据,这是正确的方法。此外,对话框本身也可以工作!