浏览代码

MaterialEditTextPreference bugs

Altered MaterialEditTextPreference to use the inner EditText view from
parent class.

EditText now also uses colorAccent from theme to color the underline
Mark 10 年之前
父节点
当前提交
aaab0d8a0b
共有 1 个文件被更改,包括 63 次插入43 次删除
  1. 63 43
      library/src/main/java/com/afollestad/materialdialogs/prefs/MaterialEditTextPreference.java

+ 63 - 43
library/src/main/java/com/afollestad/materialdialogs/prefs/MaterialEditTextPreference.java

@@ -1,13 +1,20 @@
 package com.afollestad.materialdialogs.prefs;
 
 import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.PorterDuff;
+import android.os.Build;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.preference.EditTextPreference;
 import android.util.AttributeSet;
-import android.view.ViewGroup;
+import android.util.TypedValue;
 import android.widget.EditText;
+import android.widget.FrameLayout;
 
 import com.afollestad.materialdialogs.MaterialDialog;
+import com.afollestad.materialdialogs.MaterialDialog.ButtonCallback;
 import com.afollestad.materialdialogs.R;
 
 /**
@@ -15,46 +22,59 @@ import com.afollestad.materialdialogs.R;
  */
 public class MaterialEditTextPreference extends EditTextPreference {
 
-    private EditText editText;
-
-    public MaterialEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    public MaterialEditTextPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public MaterialEditTextPreference(Context context) {
-        super(context);
-    }
-
-    @Override
-    protected void showDialog(Bundle state) {
-        MaterialDialog.Builder mBuilder = new MaterialDialog.Builder(getContext())
-                .title(getTitle())
-                .icon(getDialogIcon())
-                .positiveText(getPositiveButtonText())
-                .negativeText(getNegativeButtonText())
-                .customView(R.layout.md_input_dialog, false)
-                .callback(new MaterialDialog.ButtonCallback() {
-                    @Override
-                    public void onPositive(MaterialDialog dialog) {
-                        super.onPositive(dialog);
-                        String value = editText.getText().toString();
-                        if (callChangeListener(value) && isPersistent())
-                            setText(value);
-                    }
-                });
-
-        mBuilder.content(getDialogMessage());
-        MaterialDialog dialog = mBuilder.build();
-        editText = (EditText) ((ViewGroup) dialog.getCustomView()).getChildAt(0);
-        editText.setText(getText());
-        dialog.show();
-    }
-
-    public final EditText getEditText() {
-        return editText;
-    }
+	public MaterialEditTextPreference(Context context, AttributeSet attrs) {
+		super(context, attrs);
+		TypedValue value = new TypedValue();
+		context.getTheme().resolveAttribute(R.attr.colorAccent, value, true);
+		color = value.data;
+	}
+
+	public MaterialEditTextPreference(Context context) {
+		this(context, null);
+	}
+
+	private MaterialDialog dialog;
+	private int color = 0;
+
+	@Override
+	protected void showDialog(Bundle state) {
+
+		// Build our dialog for the first time
+		if (dialog == null)
+		{
+			if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
+				getEditText().getBackground().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
+
+			dialog = new MaterialDialog.Builder(getContext())
+					.title(getTitle())
+					.icon(getDialogIcon())
+					.positiveText(getPositiveButtonText())
+					.negativeText(getNegativeButtonText())
+					.customView(R.layout.md_input_dialog, false)
+					.callback(callback)
+					.content(getDialogMessage()).build();
+
+			// So we maintain margins
+			FrameLayout layout = (FrameLayout) dialog.getCustomView();
+			if (layout != null)
+			{
+				layout.removeAllViews();
+				layout.addView(getEditText());
+			}
+		}
+
+		// Built it, now show it
+		dialog.show();
+	}
+
+	private final ButtonCallback callback = new ButtonCallback()
+	{
+		@Override
+		public void onPositive(MaterialDialog dialog)
+		{
+			String value = getEditText().getText().toString();
+			if (callChangeListener(value) && isPersistent())
+				setText(value);
+		}
+	};
 }