更改的EditText底线颜色与程序兼容性V7更改的EditText底线颜色与程序兼容性V7(Cha

2019-05-10 09:44发布

我使用的程序兼容性V7获得的外观在Android上5和不太一致。 它的工作原理相当好。 但我无法弄清楚如何改变底线颜色和EditTexts强调色。 可能吗?

我试图定义一个定制android:editTextStyle (参见下文),但我只是成功改变全背景颜色或文本颜色,但不是底线,也不是强调色。 有没有办法使用一个特定的属性值? 我必须通过使用自定义绘制的图像android:background属性? 是不是可以指定在六色?

 <style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
     <item name="android:editTextStyle">@style/Widget.App.EditText</item>
 </style>

 <style name="Widget.App.EditText" parent="Widget.AppCompat.EditText">
     ???
 </style>

根据Android的API 21种源,与材料设计EditTexts似乎使用colorControlActivatedcolorControlNormal 。 因此,我试图覆盖以前的样式定义这些属性,但它没有任何效果。 也许程序兼容性不使用它。 不幸的是,我无法找到程序兼容性的最后一个版本用的材料设计的来源。

Answer 1:

最后,我已经找到了解决方案。 它只是由覆盖了价值colorControlActivatedcolorControlHighlightcolorControlNormal在你的应用主题定义,而不是你的EditText风格。 然后,想使用这个主题,你想用的任何活动。 下面是一个例子:

<style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorControlNormal">#c5c5c5</item>
    <item name="colorControlActivated">@color/accent</item>
    <item name="colorControlHighlight">@color/accent</item>
</style>


Answer 2:

我觉得像这样需要万一有人想改变只是一个单一的EditText答案。 我不喜欢这样写道:

editText.getBackground().mutate().setColorFilter(getResources().getColor(R.color.your_color), PorterDuff.Mode.SRC_ATOP);


Answer 3:

虽然Laurents的解决方案是正确的,它带有的,因为不仅是底线在评论中描述的一些缺点EditText被染色,但的后退按钮ToolbarCheckBoxes等为好。

幸运的是v22.1appcompat-v7引入了一些新的可能性。 现在,可以到一个特定的主题,只分配到一个视图。 直接从更新日志 :

弃用使用应用程序:主题造型工具栏。 对所有API级别主题为工具栏7和更高版本的设备和android: 您现在可以使用 Android的主题 支持的API级别11及更高版本的设备所有小工具

因此,而不是在一个全球性的主题设定所需要的颜色,我们创建了一个新的一个,并将其分配只给EditText

例:

<style name="MyEditTextTheme">
    <!-- Used for the bottom line when not selected / focused -->
    <item name="colorControlNormal">#9e9e9e</item>
    <!-- colorControlActivated & colorControlHighlight use the colorAccent color by default -->
</style>

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/MyEditTextTheme"/>


Answer 4:

以供参考。 这可以在XML通过改变:

android:backgroundTint="@color/blue"


Answer 5:

下面是API <21和上述方案

Drawable drawable = yourEditText.getBackground(); // get current EditText drawable 
drawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_ATOP); // change the drawable color

if(Build.VERSION.SDK_INT > 16) {
    yourEditText.setBackground(drawable); // set the new drawable to EditText
}else{
    yourEditText.setBackgroundDrawable(drawable); // use setBackgroundDrawable because setBackground required API 16
}

希望它能帮助



Answer 6:

接受的答案是每款基础的东西多一点,但最有效的事情就是添加colorAccent属性,这样你的AppTheme风格:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:editTextStyle">@style/EditTextStyle</item>
</style>

<style name="EditTextStyle" parent="Widget.AppCompat.EditText"/>

所述colorAccent属性用于插件着色整个应用程序,因此应该被用于一致性



Answer 7:

如果您使用的appcompat-v7:22.1.0+可以使用DrawableCompat进行着色你的widget

    public static void tintWidget(View view, int color) {
        Drawable wrappedDrawable = DrawableCompat.wrap(view.getBackground());
        DrawableCompat.setTint(wrappedDrawable.mutate(), getResources().getColor(color));
        view.setBackgroundDrawable(wrappedDrawable);
    }


Answer 8:

使用:

<EditText
    app:backgroundTint="@color/blue"/>

这将支持预棒棒糖设备不仅+21



Answer 9:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>
    <item name="colorControlHighlight">@color/colorAccent</item>

</style>



Answer 10:

你的问题的一个快速的解决方案是在yourappspackage看/建设/中间体/爆炸-AAR / com.android.support /程序兼容性-V7 / RES /绘制/为abc_edit_text_material.xml和复制XML文件中的文件夹绘制。 然后你可以从这个选择内改变9个补丁文件的颜色,以配合您的喜好。



Answer 11:

这很容易只需添加android:backgroundTint属性在你EditText

android:backgroundTint="@color/blue"
android:backgroundTint="#ffffff"
android:backgroundTint="@color/red"


 <EditText
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:backgroundTint="#ffffff"/>


Answer 12:

下面是源代码的一部分TextInputLayout在支持设计库( 更新的版本23.2.0),该改变EditText的底线颜色以更简单的方式:

private void updateEditTextBackground() {
    ensureBackgroundDrawableStateWorkaround();

    final Drawable editTextBackground = mEditText.getBackground();
    if (editTextBackground == null) {
        return;
    }

    if (mErrorShown && mErrorView != null) {
        // Set a color filter of the error color
        editTextBackground.setColorFilter(
                AppCompatDrawableManager.getPorterDuffColorFilter(
                        mErrorView.getCurrentTextColor(), PorterDuff.Mode.SRC_IN));
    }
    ...
}

似乎所有的上面的代码,如果你想以编程方式更改的颜色,现在成了无用的23.2.0。

如果你想支持所有平台,这里是我的方法:

/**
 * Set backgroundTint to {@link View} across all targeting platform level.
 * @param view the {@link View} to tint.
 * @param color color used to tint.
 */
public static void tintView(View view, int color) {
    final Drawable d = view.getBackground();
    final Drawable nd = d.getConstantState().newDrawable();
    nd.setColorFilter(AppCompatDrawableManager.getPorterDuffColorFilter(
            color, PorterDuff.Mode.SRC_IN));
    view.setBackground(nd);
}


Answer 13:

我也被卡在这个问题上太长时间。

我要求的上方和下方V21版本工作的解决方案。

我终于发现了一个很简单的也许不理想,但有效的解决方案:只需设置背景颜色为transparent的EditText上的属性。

<EditText
    android:background="@android:color/transparent"/>

我希望这可以节省某人一段时间。



Answer 14:

您可以设置的EditText的背景与左,右减去填充和顶部的长方形来实现这一目标。 下面是XML的例子:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:top="-1dp"
        android:left="-1dp"
        android:right="-1dp"
        android:bottom="1dp"
        >
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#6A9A3A"/>
        </shape>
    </item>
</layer-list>

如果你想为重点的EditText提供不同的宽度和颜色与选择更换形状。



Answer 15:

对我来说,我修改这两个AppTheme和值colors.xml无论是colorControlNormal和colorAccent帮我改的EditText边框颜色。 除了光标,而“|” 一个EditText内部时。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorControlNormal">@color/yellow</item>
    <item name="colorAccent">@color/yellow</item>
</style>

这里是colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="yellow">#B7EC2A</color>
</resources>

我拿出了android:textCursorDrawable属性@null我放在EDITTEXT风格里面。 当我试图用这个,颜色不会改变。



Answer 16:

我用这个方法来改变与PorterDuff线的颜色,没有其他可绘制。

public void changeBottomColorSearchView(int color) {
    int searchPlateId = mSearchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
    View searchPlate = mSearchView.findViewById(searchPlateId);
    searchPlate.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}


Answer 17:

如果你想改变的底线,而无需使用应用程序的颜色,用在你的主题这几行:

<item name="android:editTextStyle">@android:style/Widget.EditText</item>
<item name="editTextStyle">@android:style/Widget.EditText</item>

我不知道其他的解决方案。



Answer 18:

我制定了一个工作解决了这个问题后奋斗2天,下面的解决方案是最适合他们谁希望通过Java代码来改变只有少数编辑文本,改变/切换颜色,并要克服不同的行为对操作系统版本的问题由于使用setColorFilter()方法。

    import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.AppCompatDrawableManager;
import android.support.v7.widget.AppCompatEditText;
import android.util.AttributeSet;
import com.newco.cooltv.R;

public class RqubeErrorEditText extends AppCompatEditText {

  private int errorUnderlineColor;
  private boolean isErrorStateEnabled;
  private boolean mHasReconstructedEditTextBackground;

  public RqubeErrorEditText(Context context) {
    super(context);
    initColors();
  }

  public RqubeErrorEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    initColors();
  }

  public RqubeErrorEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initColors();
  }

  private void initColors() {
    errorUnderlineColor = R.color.et_error_color_rule;

  }

  public void setErrorColor() {
    ensureBackgroundDrawableStateWorkaround();
    getBackground().setColorFilter(AppCompatDrawableManager.getPorterDuffColorFilter(
        ContextCompat.getColor(getContext(), errorUnderlineColor), PorterDuff.Mode.SRC_IN));
  }

  private void ensureBackgroundDrawableStateWorkaround() {
    final Drawable bg = getBackground();
    if (bg == null) {
      return;
    }
    if (!mHasReconstructedEditTextBackground) {
      // This is gross. There is an issue in the platform which affects container Drawables
      // where the first drawable retrieved from resources will propogate any changes
      // (like color filter) to all instances from the cache. We'll try to workaround it...
      final Drawable newBg = bg.getConstantState().newDrawable();
      //if (bg instanceof DrawableContainer) {
      //  // If we have a Drawable container, we can try and set it's constant state via
      //  // reflection from the new Drawable
      //  mHasReconstructedEditTextBackground =
      //      DrawableUtils.setContainerConstantState(
      //          (DrawableContainer) bg, newBg.getConstantState());
      //}
      if (!mHasReconstructedEditTextBackground) {
        // If we reach here then we just need to set a brand new instance of the Drawable
        // as the background. This has the unfortunate side-effect of wiping out any
        // user set padding, but I'd hope that use of custom padding on an EditText
        // is limited.
        setBackgroundDrawable(newBg);
        mHasReconstructedEditTextBackground = true;
      }
    }
  }

  public boolean isErrorStateEnabled() {
    return isErrorStateEnabled;
  }

  public void setErrorState(boolean isErrorStateEnabled) {
    this.isErrorStateEnabled = isErrorStateEnabled;
    if (isErrorStateEnabled) {
      setErrorColor();
      invalidate();
    } else {
      getBackground().mutate().clearColorFilter();
      invalidate();
    }
  }
}

使用XML中

<com.rqube.ui.widget.RqubeErrorEditText
            android:id="@+id/f_signup_et_referral_code"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toEndOf="@+id/referral_iv"
            android:layout_toRightOf="@+id/referral_iv"
            android:ems="10"
            android:hint="@string/lbl_referral_code"
            android:imeOptions="actionNext"
            android:inputType="textEmailAddress"
            android:textSize="@dimen/text_size_sp_16"
            android:theme="@style/EditTextStyle"/>

添加在风格上线

<style name="EditTextStyle" parent="android:Widget.EditText">
    <item name="android:textColor">@color/txt_color_change</item>
    <item name="android:textColorHint">@color/et_default_color_text</item>
    <item name="colorControlNormal">@color/et_default_color_rule</item>
    <item name="colorControlActivated">@color/et_engagged_color_rule</item>
  </style>

java代码切换颜色

myRqubeEditText.setErrorState(true);
myRqubeEditText.setErrorState(false);


Answer 19:

在Activit.XML添加代码

<EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/editText"
        android:hint="Informe o usuário"
        android:backgroundTint="@android:color/transparent"/>

BackgroundTint=color供您想要的颜色



Answer 20:

我完全把这个问题百思不得其解。 我曾试图在这个线程的一切,和在其他国家,但无论我做什么我不能下划线的颜色更改为比默认的蓝色的任何其他。

我终于想通了事情的原委。 我是(错误地)使用android.widget.EditText使得当一个新的实例(但我其余部件都是从程序兼容性库)。 我应该用android.support.v7.widget.AppCompatEditText 。 我更换new EditText(this)new AppCompatEditText(this) ,并立即解决了这个问题。 事实证明,如果你实际使用AppCompatEditText ,它只会尊重accentColor从你的主题(如上面的一些意见提到),并没有额外的配置是必要的。



Answer 21:

这是最简单,最有效的/可重复使用/适用于所有的API
创建一个自定义的EditText类,如下所示:

public class EditText extends android.widget.EditText {
    public EditText(Context context) {
        super(context);
        init();
    }

    public EditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public EditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        getBackground().mutate().setColorFilter(ContextCompat.getColor(getContext(), R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
    }
}

然后使用它是这样的:

 <company.com.app.EditText
        android:layout_width="200dp"
        android:layout_height="wrap_content"/>


Answer 22:

动态改变的EditText的背景下,你可以使用ColorStateList 。

int[][] states = new int[][] {
    new int[] { android.R.attr.state_enabled}, // enabled
    new int[] {-android.R.attr.state_enabled}, // disabled
    new int[] {-android.R.attr.state_checked}, // unchecked
    new int[] { android.R.attr.state_pressed}  // pressed
};

int[] colors = new int[] {
    Color.BLACK,
    Color.RED,
    Color.GREEN,
    Color.BLUE
};

ColorStateList colorStateList = new ColorStateList(states, colors);

积分: 此SO回答有关ColorStateList是真棒 。



Answer 23:

请根据你的需要修改这个方法。 这为我工作!

  private boolean validateMobilenumber() {
        if (mobilenumber.getText().toString().trim().isEmpty() || mobilenumber.getText().toString().length() < 10) {
            input_layout_mobilenumber.setErrorEnabled(true);
            input_layout_mobilenumber.setError(getString(R.string.err_msg_mobilenumber));
           // requestFocus(mobilenumber);
            return false;
        } else {
            input_layout_mobilenumber.setError(null);
            input_layout_mobilenumber.setErrorEnabled(false);
            mobilenumber.setBackground(mobilenumber.getBackground().getConstantState().newDrawable());
        }


文章来源: Changing EditText bottom line color with appcompat v7