MaterialEditTextPreference.java 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package com.afollestad.materialdialogs.prefs;
  2. import android.app.Dialog;
  3. import android.content.Context;
  4. import android.content.DialogInterface;
  5. import android.os.Build;
  6. import android.os.Bundle;
  7. import android.preference.EditTextPreference;
  8. import android.preference.PreferenceManager;
  9. import android.support.annotation.NonNull;
  10. import android.support.v7.widget.AppCompatEditText;
  11. import android.util.AttributeSet;
  12. import android.view.LayoutInflater;
  13. import android.view.View;
  14. import android.view.ViewGroup;
  15. import android.view.ViewParent;
  16. import android.view.Window;
  17. import android.view.WindowManager;
  18. import android.widget.EditText;
  19. import android.widget.LinearLayout;
  20. import android.widget.TextView;
  21. import com.afollestad.materialdialogs.MaterialDialog;
  22. import com.afollestad.materialdialogs.MaterialDialog.Builder;
  23. import com.afollestad.materialdialogs.MaterialDialog.ButtonCallback;
  24. import com.afollestad.materialdialogs.R;
  25. import com.afollestad.materialdialogs.internal.MDTintHelper;
  26. import com.afollestad.materialdialogs.util.DialogUtils;
  27. import java.lang.reflect.Method;
  28. /**
  29. * @author Aidan Follestad (afollestad)
  30. */
  31. public class MaterialEditTextPreference extends EditTextPreference {
  32. private int mColor = 0;
  33. private MaterialDialog mDialog;
  34. private EditText mEditText;
  35. public MaterialEditTextPreference(Context context, AttributeSet attrs) {
  36. super(context, attrs);
  37. final int fallback;
  38. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
  39. fallback = DialogUtils.resolveColor(context, android.R.attr.colorAccent);
  40. else fallback = 0;
  41. mColor = DialogUtils.resolveColor(context, R.attr.colorAccent, fallback);
  42. mEditText = new AppCompatEditText(context, attrs);
  43. mEditText.setEnabled(true);
  44. }
  45. public MaterialEditTextPreference(Context context) {
  46. this(context, null);
  47. }
  48. @Override
  49. protected void onAddEditTextToDialogView(@NonNull View dialogView, @NonNull EditText editText) {
  50. if (editText.getParent() != null)
  51. ((ViewGroup) mEditText.getParent()).removeView(editText);
  52. ((ViewGroup) dialogView).addView(editText, new LinearLayout.LayoutParams(
  53. ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
  54. }
  55. @Override
  56. protected void onBindDialogView(@NonNull View view) {
  57. mEditText.setText("");
  58. if (getText() != null)
  59. mEditText.setText(getText());
  60. ViewParent oldParent = mEditText.getParent();
  61. if (oldParent != view) {
  62. if (oldParent != null)
  63. ((ViewGroup) oldParent).removeView(mEditText);
  64. onAddEditTextToDialogView(view, mEditText);
  65. }
  66. }
  67. @Override
  68. protected void onDialogClosed(boolean positiveResult) {
  69. if (positiveResult) {
  70. String value = mEditText.getText().toString();
  71. if (callChangeListener(value)) {
  72. setText(value);
  73. }
  74. }
  75. }
  76. public EditText getEditText() {
  77. return mEditText;
  78. }
  79. @Override
  80. public Dialog getDialog() {
  81. return mDialog;
  82. }
  83. @Override
  84. protected void showDialog(Bundle state) {
  85. Builder mBuilder = new MaterialDialog.Builder(getContext())
  86. .title(getDialogTitle())
  87. .icon(getDialogIcon())
  88. .positiveText(getPositiveButtonText())
  89. .negativeText(getNegativeButtonText())
  90. .callback(callback)
  91. .dismissListener(this)
  92. .showListener(new DialogInterface.OnShowListener() {
  93. @Override
  94. public void onShow(DialogInterface dialog) {
  95. if (mEditText.getText().length() > 0)
  96. mEditText.setSelection(mEditText.length());
  97. }
  98. });
  99. View layout = LayoutInflater.from(getContext()).inflate(R.layout.md_stub_inputpref, null);
  100. onBindDialogView(layout);
  101. MDTintHelper.setTint(mEditText, mColor);
  102. TextView message = (TextView) layout.findViewById(android.R.id.message);
  103. if (getDialogMessage() != null && getDialogMessage().toString().length() > 0) {
  104. message.setVisibility(View.VISIBLE);
  105. message.setText(getDialogMessage());
  106. } else {
  107. message.setVisibility(View.GONE);
  108. }
  109. mBuilder.customView(layout, false);
  110. PreferenceManager pm = getPreferenceManager();
  111. try {
  112. Method method = pm.getClass().getDeclaredMethod(
  113. "registerOnActivityDestroyListener",
  114. PreferenceManager.OnActivityDestroyListener.class);
  115. method.setAccessible(true);
  116. method.invoke(pm, this);
  117. } catch (Exception e) {
  118. e.printStackTrace();
  119. }
  120. mDialog = mBuilder.build();
  121. if (state != null)
  122. mDialog.onRestoreInstanceState(state);
  123. requestInputMethod(mDialog);
  124. mDialog.show();
  125. }
  126. /**
  127. * Callback listener for the MaterialDialog. Positive button checks with
  128. * OnPreferenceChangeListener before committing user entered text
  129. */
  130. private final ButtonCallback callback = new ButtonCallback() {
  131. @Override
  132. public void onPositive(MaterialDialog dialog) {
  133. String value = mEditText.getText().toString();
  134. if (callChangeListener(value) && isPersistent())
  135. setText(value);
  136. }
  137. };
  138. /**
  139. * Copied from DialogPreference.java
  140. */
  141. private void requestInputMethod(Dialog dialog) {
  142. Window window = dialog.getWindow();
  143. window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
  144. }
  145. @Override
  146. public void onActivityDestroy() {
  147. super.onActivityDestroy();
  148. if (mDialog != null && mDialog.isShowing())
  149. mDialog.dismiss();
  150. }
  151. }