【问题标题】:AlertDialog issue on AndroidAndroid上的AlertDialog问题
【发布时间】:2023-03-30 14:37:01
【问题描述】:

我在尝试显示自定义内容 AlertDialog 时遇到了一些奇怪的 UI 问题。该对话框要求用户输入一个名称,并且不允许他不这样做就继续前进。这也是用户在活动开始时看到的第一件事。

有时,在应用程序重新启动后 - 假设我在打开对话框时按下主页按钮,然后我重新打开应用程序,AlertDialog 正按应有的方式显示,但父活动的布局并未显示正确加载。它实际上保留了用户看到的上一个 Activity 的布局。更奇怪的是,这种布局几乎总是向后显示。在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();
    }
}

起初我怀疑这可能会发生,因为我在活动的onCreate() 回调中调用了DialogFragmentshow 方法(因为它可能为时过早),但推迟到@987654332 @ 没有解决问题。此问题也会发生在方向更改时,使对话框后面的背景变黑。我确定我做错了什么,但我真的不知道那是什么。

【问题讨论】:

    标签: android android-alertdialog dialogfragment


    【解决方案1】:

    我真的没有得到你想要做的事情。但是你做错了一件事。

    在类 NicknamePickerDialog 中覆盖方法 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() 中更好地创建按钮和标题。

    dialog.setTitle(R.string.pick_nickname);

    希望这会奏效。

    【讨论】:

    • 我真的尽力解释了这个问题,老实说,我不认为你必须多次阅读代码才能清楚地理解发生了什么。我正在使用Fragment 的子类,它专门用于处理对话框,根据Docs,这是正确的方法。此外,对话框本身也有效!
    猜你喜欢
    • 2012-09-05
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多