【问题标题】:How to change color of the bubble (under cursor) on EditText (programmatically)?如何(以编程方式)更改 EditText 上气泡(光标下)的颜色?
【发布时间】:2017-04-14 20:10:28
【问题描述】:

我有 EditText 并想在代码上以编程方式更改颜色

要更改光标的颜色,我使用this code

但是如何在代码上以编程方式更改 EditView 上圆圈的颜色?

【问题讨论】:

标签: android colors styles text-cursor editview


【解决方案1】:

试试这个:更改 values/colors.xml 文件中的值

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

将此颜色代码#263238 更改为您自己的颜色代码,使其适用于所有项目。 希望这会对你有所帮助。

【讨论】:

  • 我知道样式和主题,你读过问题吗?我想在代码上以编程方式更改它!!!
  • 你最近编辑了你的帖子,我认为你不需要在整个项目中更改光标颜色,所以我建议发布该帖子,
【解决方案2】:

您将需要使用反射来为选择手柄(气泡)着色。我今天早上写了以下课程:

使用示例:

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

EditTextTint.java

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

}

注意:这应该适用于从果冻豆到牛轧糖。但是,由于它使用反射来获取和设置私有字段,这可能会在未来的 Android 版本中或者如果制造商对 EditText 进行了更改。

【讨论】:

    【解决方案3】:

    以下方法适用于所有光标气泡,例如左、右和中心。我的意思是,除了您的要求,它适用于左右两边。

    例如;

    您可以通过删除两个数组中的左右字段名称将该方法更改为仅对中心句柄着色。

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

    【讨论】:

      猜你喜欢
      • 2016-05-22
      • 2020-05-26
      • 2014-11-17
      • 2016-06-05
      • 1970-01-01
      • 2012-07-23
      • 2015-04-02
      • 1970-01-01
      • 2021-10-03
      相关资源
      最近更新 更多