Selaa lähdekoodia

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 vuotta sitten
vanhempi
commit
aaab0d8a0b

+ 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);
+		}
+	};
 }