2016-11-30 14 views
13

Düzenleme elimde ve renk geçişini PROGRAMPOLAMA kodunda istiyorum.Balonun rengini (imlecin altında) EditView (PROGRAMLA) olarak nasıl değiştirebilirim?

İmlecin rengini değiştirmek için this code kullanıyorum.

Ama EditView üzerinde dairenin rengini nasıl değiştirebiliriz? PROGRAMLANICI Kod? enter image description here

+0

Olası kopyalar [android içinde (imlecin altında) EditText kabarcık rengini değiştirmek nasıl?] (Http://stackoverflow.com/questions/35337909/how-to-change-edittext-bubble-color-under -karakter-in-android) –

+0

@Jack Soruyu okudunuz mu? kod üzerinde renk programatik değiştirmek! – NickUnuchek

+0

ColorAccent için gerekli renk kümesiyle yeni bir tema oluşturabilir ve temayı programatik olarak ayarlayabilirsiniz. –

cevap

10

Seçme tutamaçlarını (kabarcıkları) renklendirmek için yansıma kullanmanız gerekir.

Örnek kullanımını:

try { 
    EditTextTint.applyColor(editText, Color.CYAN); 
} catch (EditTextTint.EditTextTintError e) { 
    e.printStackTrace(); 
} 

EditTextTint.java: Aşağıdaki sınıf bu sabah yazdım

import android.content.res.Resources; 
import android.graphics.PorterDuff; 
import android.graphics.drawable.Drawable; 
import android.support.annotation.ColorInt; 
import android.support.annotation.NonNull; 
import android.widget.EditText; 
import android.widget.TextView; 
import java.lang.reflect.Field; 

/** 
* Tint the cursor and select handles of an {@link EditText} programmatically. 
*/ 
public class EditTextTint { 

    /** 
    * Set the cursor and handle colors for an {@link EditText} programmatically. 
    * 
    * @param editText 
    *  The {@link EditText} to tint 
    * @param color 
    *  The color to apply for the cursor and select handles 
    * @throws EditTextTintError 
    *  If an error occured while attempting to tint the view. 
    */ 
    public static void applyColor(@NonNull EditText editText, @ColorInt int color) throws EditTextTintError { 
    EditTextTint editTextTint = new Builder(editText) 
     .setCursorColor(color) 
     .setSelectHandleLeftColor(color) 
     .setSelectHandleRightColor(color) 
     .setSelectHandleMiddleColor(color) 
     .build(); 
    editTextTint.apply(); 
    } 

    private final EditText editText; 
    private final Integer cursorColor; 
    private final Integer selectHandleLeftColor; 
    private final Integer selectHandleRightColor; 
    private final Integer selectHandleMiddleColor; 

    private EditTextTint(Builder builder) { 
    editText = builder.editText; 
    cursorColor = builder.cursorColor; 
    selectHandleLeftColor = builder.selectHandleLeftColor; 
    selectHandleRightColor = builder.selectHandleRightColor; 
    selectHandleMiddleColor = builder.selectHandleMiddleColor; 
    } 

    /** 
    * Sets the color for the cursor and handles on the {@link EditText editText}. 
    * 
    * @throws EditTextTintError 
    *  if an error occurs while tinting the view. 
    */ 
    public void apply() throws EditTextTintError { 
    try { 
     Resources res = editText.getContext().getResources(); 

     // Get the editor 
     Field field = TextView.class.getDeclaredField("mEditor"); 
     field.setAccessible(true); 
     Object editor = field.get(editText); 

     if (cursorColor != null) { 
     // Get the cursor drawable, tint it, and set it on the TextView Editor 
     field = TextView.class.getDeclaredField("mCursorDrawableRes"); 
     field.setAccessible(true); 
     int cursorDrawableRes = field.getInt(editText); 
     Drawable cursorDrawable = res.getDrawable(cursorDrawableRes).mutate(); 
     cursorDrawable.setColorFilter(cursorColor, PorterDuff.Mode.SRC_IN); 
     Drawable[] drawables = {cursorDrawable, cursorDrawable}; 
     field = editor.getClass().getDeclaredField("mCursorDrawable"); 
     field.setAccessible(true); 
     field.set(editor, drawables); 
     } 

     String[] resFieldNames = {"mTextSelectHandleLeftRes", "mTextSelectHandleRightRes", "mTextSelectHandleRes"}; 
     String[] drawableFieldNames = {"mSelectHandleLeft", "mSelectHandleRight", "mSelectHandleCenter"}; 
     Integer[] colors = {selectHandleLeftColor, selectHandleRightColor, selectHandleMiddleColor}; 

     for (int i = 0; i < resFieldNames.length; i++) { 
     Integer color = colors[i]; 
     if (color == null) { 
      continue; 
     } 

     String resFieldName = resFieldNames[i]; 
     String drawableFieldName = drawableFieldNames[i]; 

     field = TextView.class.getDeclaredField(resFieldName); 
     field.setAccessible(true); 
     int selectHandleRes = field.getInt(editText); 

     Drawable selectHandleDrawable = res.getDrawable(selectHandleRes).mutate(); 
     selectHandleDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); 

     field = editor.getClass().getDeclaredField(drawableFieldName); 
     field.setAccessible(true); 
     field.set(editor, selectHandleDrawable); 
     } 
    } catch (Exception e) { 
     throw new EditTextTintError("Error applying tint to " + editText, e); 
    } 
    } 

    public static class Builder { 

    final EditText editText; 
    Integer cursorColor; 
    Integer selectHandleLeftColor; 
    Integer selectHandleRightColor; 
    Integer selectHandleMiddleColor; 

    public Builder(@NonNull EditText editText) { 
     this.editText = editText; 
    } 

    public Builder setCursorColor(@ColorInt int cursorColor) { 
     this.cursorColor = cursorColor; 
     return this; 
    } 

    public Builder setSelectHandleLeftColor(@ColorInt int selectHandleLeftColor) { 
     this.selectHandleLeftColor = selectHandleLeftColor; 
     return this; 
    } 

    public Builder setSelectHandleRightColor(@ColorInt int selectHandleRightColor) { 
     this.selectHandleRightColor = selectHandleRightColor; 
     return this; 
    } 

    public Builder setSelectHandleMiddleColor(@ColorInt int selectHandleMiddleColor) { 
     this.selectHandleMiddleColor = selectHandleMiddleColor; 
     return this; 
    } 

    public EditTextTint build() { 
     return new EditTextTint(this); 
    } 

    } 

    public static class EditTextTintError extends Exception { 

    public EditTextTintError(String message, Throwable cause) { 
     super(message, cause); 
    } 
    } 

} 

Not: Bu NOUGAT için Jelly Bean dan çalışmalıdır. Ancak, özel alanları almak ve ayarlamak için yansıma kullandığından, bu, Android'in gelecekteki sürümlerinde bozulabilir veya bir üretici EditText'te değişiklikler yaptıysa.

+0

Sen benim kahramanımsın. –

-1

bu deneyin: tüm proje için geçerli olacak şekilde, kendi renk koduna değerler/colors.xml dosyasında

<color name="colorAccent">#263238</color> 

değişikliği bu renk kodu # 263238 değerini değiştirin. Umut, bu size yardımcı olacaktır.

+0

Stilleri ve temaları biliyorum, soru okudun mu? Ben kod üzerinde programatik değiştirmek istiyorum! – NickUnuchek

+0

Son zamanlarda gönderilerinizi düzenlediyseniz, proje boyunca imleç rengini değiştirmenize gerek olmadığını düşündüm, bu yüzden bu postayı önerdim, –

2

Aşağıdaki yöntem, sol, sağ ve merkez gibi tüm imleç baloncukları için çalışır. Yani isteğinizin yanında, hem sol hem de sağ olanlar için çalışıyor.

Örneğin; Beside your request, It works for both left and right ones

Bu yöntemi, iki dizide sol ve sağ alan adlarını kaldırarak yalnızca ortadaki tutamacı renklendirmek için değiştirebilirsiniz.

public static void colorHandles(TextView view, int color) { 
    try { 
    Field editorField = TextView.class.getDeclaredField("mEditor"); 
    if (!editorField.isAccessible()) { 
     editorField.setAccessible(true); 
    } 

    Object editor = editorField.get(view); 
    Class<?> editorClass = editor.getClass(); 

    String[] handleNames = {"mSelectHandleLeft", "mSelectHandleRight", "mSelectHandleCenter"}; 
    String[] resNames = {"mTextSelectHandleLeftRes", "mTextSelectHandleRightRes", "mTextSelectHandleRes"}; 

    for (int i = 0; i < handleNames.length; i++) { 
     Field handleField = editorClass.getDeclaredField(handleNames[i]); 
     if (!handleField.isAccessible()) { 
     handleField.setAccessible(true); 
     } 

     Drawable handleDrawable = (Drawable) handleField.get(editor); 

     if (handleDrawable == null) { 
     Field resField = TextView.class.getDeclaredField(resNames[i]); 
     if (!resField.isAccessible()) { 
      resField.setAccessible(true); 
     } 
     int resId = resField.getInt(view); 
     handleDrawable = view.getResources().getDrawable(resId); 
     } 

     if (handleDrawable != null) { 
     Drawable drawable = handleDrawable.mutate(); 
     drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
     handleField.set(editor, drawable); 
     } 
    } 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 
ait
İlgili konular