1
0

MaterialEditTextPreference.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package com.afollestad.materialdialogs.prefs;
  2. import android.app.Dialog;
  3. import android.content.Context;
  4. import android.graphics.PorterDuff;
  5. import android.os.Build.VERSION;
  6. import android.os.Build.VERSION_CODES;
  7. import android.os.Bundle;
  8. import android.preference.EditTextPreference;
  9. import android.support.annotation.NonNull;
  10. import android.util.AttributeSet;
  11. import android.view.LayoutInflater;
  12. import android.view.View;
  13. import android.view.ViewGroup;
  14. import android.view.ViewParent;
  15. import android.view.Window;
  16. import android.view.WindowManager;
  17. import android.widget.EditText;
  18. import android.widget.LinearLayout;
  19. import android.widget.TextView;
  20. import com.afollestad.materialdialogs.MaterialDialog;
  21. import com.afollestad.materialdialogs.MaterialDialog.Builder;
  22. import com.afollestad.materialdialogs.MaterialDialog.ButtonCallback;
  23. import com.afollestad.materialdialogs.R;
  24. import com.afollestad.materialdialogs.util.DialogUtils;
  25. /**
  26. * @author Aidan Follestad (afollestad)
  27. */
  28. public class MaterialEditTextPreference extends EditTextPreference {
  29. private int mColor = 0;
  30. public MaterialEditTextPreference(Context context, AttributeSet attrs) {
  31. super(context, attrs);
  32. if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
  33. mColor = DialogUtils.resolveColor(context, R.attr.colorAccent);
  34. }
  35. public MaterialEditTextPreference(Context context) {
  36. this(context, null);
  37. }
  38. @Override
  39. protected void onAddEditTextToDialogView(@NonNull View dialogView, @NonNull EditText editText) {
  40. if (editText.getParent() != null)
  41. ((ViewGroup) getEditText().getParent()).removeView(editText);
  42. ((ViewGroup) dialogView).addView(editText, new LinearLayout.LayoutParams(
  43. ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
  44. }
  45. @Override
  46. protected void onBindDialogView(@NonNull View view) {
  47. getEditText().setText("");
  48. if (getText() != null)
  49. getEditText().append(getText());
  50. ViewParent oldParent = getEditText().getParent();
  51. if (oldParent != view) {
  52. if (oldParent != null)
  53. ((ViewGroup) oldParent).removeView(getEditText());
  54. onAddEditTextToDialogView(view, getEditText());
  55. }
  56. }
  57. @Override
  58. protected void showDialog(Bundle state) {
  59. Builder mBuilder = new MaterialDialog.Builder(getContext())
  60. .title(getDialogTitle())
  61. .icon(getDialogIcon())
  62. .positiveText(getPositiveButtonText())
  63. .negativeText(getNegativeButtonText())
  64. .callback(callback)
  65. .dismissListener(this)
  66. .content(getDialogMessage());
  67. View layout = LayoutInflater.from(getContext()).inflate(R.layout.md_stub_inputpref, null);
  68. onBindDialogView(layout);
  69. if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
  70. getEditText().getBackground().setColorFilter(mColor, PorterDuff.Mode.SRC_ATOP);
  71. TextView message = (TextView) layout.findViewById(android.R.id.message);
  72. if (getDialogMessage() != null && getDialogMessage().toString().length() > 0) {
  73. message.setVisibility(View.VISIBLE);
  74. message.setText(getDialogMessage());
  75. } else {
  76. message.setVisibility(View.GONE);
  77. }
  78. mBuilder.customView(layout, false);
  79. MaterialDialog mDialog = mBuilder.build();
  80. if (state != null)
  81. mDialog.onRestoreInstanceState(state);
  82. requestInputMethod(mDialog);
  83. mDialog.show();
  84. }
  85. /**
  86. * Callback listener for the MaterialDialog. Positive button checks with
  87. * OnPreferenceChangeListener before committing user entered text
  88. */
  89. private final ButtonCallback callback = new ButtonCallback() {
  90. @Override
  91. public void onPositive(MaterialDialog dialog) {
  92. String value = getEditText().getText().toString();
  93. if (callChangeListener(value) && isPersistent())
  94. setText(value);
  95. }
  96. };
  97. /**
  98. * Copied from DialogPreference.java
  99. */
  100. private void requestInputMethod(Dialog dialog) {
  101. Window window = dialog.getWindow();
  102. window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
  103. }
  104. }