我在嘗試顯示自定義內容AlertDialog
時遇到了一些奇怪的UI問題。該對話框要求用戶輸入一個名字,並且不允許他在沒有這樣做的情況下前進。這也是用戶在活動開始時看到的第一件事情。Android上的AlertDialog問題
有時候,在應用程序重新啓動後 - 比方說,當我打開對話框時按下主頁按鈕,然後重新打開應用程序,AlertDialog
正在顯示,因爲它應該是,但父活動的佈局未加載正確。它實際上保留了用戶看到的前一個活動的佈局。更奇怪的是,這種佈局幾乎總是向後顯示。您可以在here中看到更好的效果。在對話框後面,它應該是一個空白的白色佈局,而是從「設置」應用中恢復啓動器活動的「快照」。
由於官方文件建議我將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;
}
}
這是Activity
代碼
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();
}
}
起初我懷疑這可能是因爲我打電話了DialogFragment
的活動的onCreate()
回調內部show
方法(因爲它可能是太早) ,但推遲到onResume()
不能解決問題。在方向更改時也會發生此問題,導致對話框背後的背景變黑。我確信我做錯了什麼,但我真的不知道那是什麼。
我真的盡我所能來解釋這個問題,我真的不認爲你必須不止一次閱讀代碼才能清楚地理解發生了什麼。我正在使用'Fragment'的子類,它專門用於處理對話框,並根據[文檔](http://developer.android.com/guide/topics/ui/dialogs.html#DialogFragment),這是正確的方式來做到這一點。另外,對話本身也有效! –