扩展EditTextPreference并显示DialogMessage

时间:2014-12-14 18:04:26

标签: android edittextpreference dialog-preference

我已经扩展了EditTextPreference,但是对话框消息将不会显示。如果我以编程方式或在preferences.xml中添加dialogMessage,则会发生这种情况。

这是我的onBindDialogView:

AutoCompleteTextView editText = mEditText;
editText.setText(getText());

ViewParent oldParent = editText.getParent();
if (oldParent != view) {
    if (oldParent != null) {
        ((ViewGroup) oldParent).removeView(editText);
    }
    onAddEditTextToDialogView(view, editText);
}

1 个答案:

答案 0 :(得分:0)

对话框消息真的不存在吗?它可能在那里,但它的文字颜色可能会减少(或不)可见。 (或尝试解除软件键盘)。尝试尝试具有多个" \ n"的对话框消息。字符,看看是否会影响对话框布局。如果是这样,这意味着对话框消息实际上存在,但伪装得太好了。

EditTextPreference带来一个文本视图(在preference_dialog_edittext.xml中),用于替换对话框消息的现有视图(在alert_dialog.xml中),但不幸的是,它具有不同的文本样式,这可能会导致某些主题下的可见性问题。甚至他们的尺寸也不同。

一种解决方案可能是从原始文本视图中获取要替换的文本颜色和大小并将其应用于新文本,但我建议保留原始文本视图,因为它更可能如果将来有任何UI更改,请在视觉上保持一致。尝试添加以下替换

protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
    super.onPrepareDialogBuilder(builder);
    builder.setMessage(getDialogMessage()); // bring back the original text view
}

protected void onAddEditTextToDialogView(View dialogView, EditText editText) {
    int id = getContext().getResources().getIdentifier("edittext_container", "id", "android");
    ViewGroup container = (ViewGroup) dialogView.findViewById(id);
    container.removeAllViews(); // remove the new text view
    super.onAddEditTextToDialogView(dialogView, editText);
}

如果您认为对话框消息和edittext视图相距太远,可以通过添加另一个覆盖来将它们放在一起:

protected void showDialog(Bundle state) {
    super.showDialog(state);
    int id = getContext().getResources().getIdentifier("message", "id", "android");
    TextView message = (TextView) getDialog().findViewById(id);
    message.setPadding(message.getPaddingLeft(), message.getPaddingTop(), message.getPaddingRight(), 0);
}

并在调用removeAllViews后在onAddEditTextToDialogView方法中添加以下行:

    container.setPadding(container.getPaddingLeft(), 0, container.getPaddingRight(), container.getPaddingBottom());