Thay đổi màu dòng dưới cùng của EditText với appcompat v7


310

Tôi đang sử dụng appcompat v7 để có giao diện phù hợp trên Android 5 trở xuống. Nó hoạt động khá tốt. Tuy nhiên tôi không thể tìm ra cách thay đổi màu dòng dưới cùng và màu nhấn cho EditTexts. Có thể không?

Tôi đã cố gắng xác định một tùy chỉnh android:editTextStyle(xem bên dưới) nhưng tôi chỉ thành công trong việc thay đổi màu nền hoặc màu văn bản đầy đủ chứ không phải dòng dưới cùng cũng không phải màu nhấn. Có một giá trị tài sản cụ thể để sử dụng? Tôi có phải sử dụng hình ảnh có thể vẽ tùy chỉnh thông qua android:backgroundtài sản không? không thể chỉ định một màu trong hexa?

 <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>

Theo nguồn API của Android 21, EditTexts với thiết kế vật liệu dường như sử dụng colorControlActivatedcolorControlNormal. Do đó, tôi đã cố gắng ghi đè các thuộc tính này trong định nghĩa kiểu trước đó nhưng nó không có hiệu lực. Có lẽ appcompat không sử dụng nó. Thật không may, tôi không thể tìm thấy các nguồn cho phiên bản cuối cùng của appcompat với thiết kế vật liệu.


xác định chủ đề của bạn để chỉnh sửa văn bản
Meenal

Cảm ơn lời đề nghị của bạn nhưng tôi đã làm điều đó. Tôi đã cập nhật câu hỏi của mình để cho thấy những gì tôi đã cố gắng làm. Vấn đề của tôi là về thuộc tính được sử dụng trong phong cách chủ đề để thay đổi màu dòng dưới cùng edittext. Lý tưởng nhất, tôi đang tìm kiếm một giải pháp trong đó tôi có thể chỉ định màu trực tiếp trong hexa.
Laurent

Không có câu trả lời nào trong số này làm việc cho tôi trên 4.3. Bạn có một giải pháp làm việc?
Robert Baker

Tôi đã phải gia hạn AppCompatEditText, rõ ràng.
EpicPandaForce

Câu trả lời:


479

Cuối cùng, tôi đã tìm ra một giải pháp. Nó chỉ đơn giản bao gồm ghi đè giá trị cho colorControlActivated, colorControlHighlightcolorControlNormaltrong định nghĩa chủ đề ứng dụng của bạn chứ không phải kiểu edittext của bạn. Sau đó, suy nghĩ để sử dụng chủ đề này cho bất kỳ hoạt động nào bạn muốn. Dưới đây là một ví dụ:

<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>

9
Tôi thấy màu của hamburger menu, nút quay lại và thanh cuộn đã thay đổi thành colorControlN normal.
ario

11
Điều này thay đổi màu của dòng dưới cùng nhưng nó cũng thay đổi mọi điều khiển khác như hộp kiểm, nút radio, v.v. Nó cũng thay đổi mọi EditText trên toàn bộ Ứng dụng / Hoạt động. Nếu bạn muốn thay đổi dòng dưới cùng của một EditText (như tôi làm) thì bạn phải ghi đè lên thuộc tính android: background cho EditText đó. Không có cách nào khác AFAIK.
Emanuel Moecklin 6/2/2015

68
Nếu bạn đang sử dụng thư viện hỗ trợ AppCompat v22, bạn có thể chỉ định chủ đề trong EditText như : android:theme="@style/Theme.App.Base. Điều này sẽ đảm bảo phong cách sẽ không ảnh hưởng đến các chế độ xem khác trong bố cục của bạn mà bạn không muốn thay đổi.
Alex Lockwood

8
Không hoạt động trên Jelly Bean (4.2) nhưng hoạt động trên Lollipop
Mangesh

3
Các hoạt động nên kế thừa từ AppCompatActivity. Nó sẽ không hoạt động nếu nó kế thừa từ Activity.
Bharathwaaj

187

Tôi cảm thấy như điều này cần một câu trả lời trong trường hợp ai đó muốn thay đổi chỉ một edittext. Tôi làm như thế này:

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

1
Nhưng làm thế nào tôi có thể thiết lập lại nền mặc định, tôi đã gặp rất nhiều lỗi sau khi gọi editText.getBackground (). ResetColorFilter () trên Lollipop?
ultraon

Chú ý! việc thêm này có thể gây ra thay đổi màu sắc của editText trên TẤT CẢ ứng dụng. Đã thử nghiệm trên Nexus 5. HĐH 6.0.1.
Alex Perevozchykov 4/2/2016

1
@AlexPerevozchykov bạn có thể đúng. Hãy thử thêm .mutate () sau .getBackground (). Nên làm vậy.
hordurh

@hordurh vâng, chính là nó, tôi đã nhận được đề nghị này sớm hơn một chút, các ngăn kéo chia sẻ một nhóm vì vậy trước khi thay đổi, chúng ta cần phải thay đổi nó
Alex Perevozchykov 5/2/2016

1
Nếu tôi sử dụng edittext, nó hoạt động nhưng phương pháp này không hoạt động với edittext ứng dụng trên kẹo mút. Bạn có biết làm thế nào tôi có thể giải quyết vấn đề?
Selin

145

Mặc dù giải pháp Laurents là chính xác, nó đi kèm với một số nhược điểm như được mô tả trong các nhận xét vì không chỉ dòng dưới cùng của EditTextmàu được tô màu mà còn cả Nút Quay lại của Toolbar, CheckBoxesv.v.

May mắn v22.1của appcompat-v7giới thiệu một số khả năng mới. Bây giờ có thể chỉ định một chủ đề cụ thể cho một chế độ xem. Trực tiếp từ Changelog :

Không sử dụng ứng dụng: chủ đề để tạo kiểu Thanh công cụ. Giờ đây, bạn có thể sử dụng android: theme cho thanh công cụ trên tất cả các thiết bị API cấp 7 trở lên và android: hỗ trợ chủ đề cho tất cả các tiện ích trên API cấp 11 trở lên.

Vì vậy, thay vì đặt màu mong muốn trong một chủ đề toàn cầu, chúng tôi tạo một màu mới và chỉ gán nó cho EditText.

Thí dụ:

<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"/>

1
Tôi không nghĩ rằng điều này là cần thiết. colorControlNormalkhông có tiền tố Android sử dụng phương thức appcompat để điều chỉnh các widget trong khi với tiền tố, nó lại rơi vào phương thức hệ thống và điều này chỉ khả dụng trong các thiết bị API 21+.
Xác minh lại

hmm, tôi đã thử nghiệm trên thiết bị kẹo mút của mình và nó không chuyển sang màu tùy chỉnh trừ khi bạn thực hiện nó theo kiểu v21 với không gian tên android.
dùng2968401

Tôi đang sử dụng 22.2.0phiên bản AppCompat nhưng thủ thuật này không hoạt động :(
Shajeel Afzal

1
sử dụng <item name = "colorAccent"> # 000000 </ item> làm việc cho tôi thay vì colorControlN normal.
MikeOscarEcho

Hoàn hảo để chỉ thay đổi một văn bản chỉnh sửa trong ứng dụng! (Chính xác những gì tôi cần! Cảm ơn)
Romain Barbier

99

Điều này có thể được thay đổi trong XML bằng cách sử dụng:

Đối với API tham chiếu> = 21 sử dụng tương thích:

android:backgroundTint="@color/blue"

Đối với API lạc hậu <21 sử dụng tương thích:

app:backgroundTint="@color/blue"

10
Có, tuy nhiên, điều này chỉ hoạt động cho các phiên bản API Android 21+ (kitkat & lolipop). Một người có lẽ sẽ cố gắng tạo ra một giải pháp tương thích ngược.
DaMachk

12
Chỉ sử dụng backgroundTint="@color/blue"thay vì android:backgroundTint="@color/blue"hỗ trợ tương thích ngược
Kishan Vaghela

11
@KishanVaghela, thay vì sử dụng android:backgroundTint="@color/blue", hãy sử dụng app:backgroundTint="@color/blue"để hỗ trợ các thiết bị tiền Lollipop, cảm ơn vì nhận xét của bạn!
bluware

2
@bluware Nếu bạn muốn sử dụng nó theo phong cách, thì chúng tôi không cần sử dụng "ứng dụng".
Kishan Vaghela

thêm tools:ignore="MissingPrefix"nếu một gạch dưới màu đỏ bật dướiapp:backgroundTint="<your color>"
Moses Aprico

47

Đây là giải pháp cho API <21 trở lên

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
}

nhập mô tả hình ảnh ở đây

Hy vọng nó sẽ giúp


@CoolMind xin lỗi vì phản hồi muộn. Tôi có kiểm tra mã này một lần nữa trong thư viện hỗ trợ 24.2.1, 25.1.1, 25.2.0cho điện thoại <21 và> 21 và nó vẫn còn làm việc. Vui lòng kiểm tra ổ đĩa demo đơn giản này.google.com/file/d/0B_poNaia6t8kSzU3bDFVazRSSDA/ . Tôi không biết tại sao mã này không hiệu quả với bạn vì vậy vui lòng cho tôi biết. cảm ơn bạn
Phan Văn Linh

@Renjith xin lỗi vì phản hồi muộn, vui lòng kiểm tra nhận xét của tôi ở trên
Phan Văn Linh

Làm thế nào để bạn thiết lập lại màu sắc để mặc định với mã này?
Cháu

35

Câu trả lời được chấp nhận là nhiều hơn một chút cho mỗi điều cơ bản về kiểu dáng, nhưng điều hiệu quả nhất cần làm là thêm thuộc tính colorAccent trong kiểu AppTheme của bạn như sau:

<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"/>

Thuộc tính colorAccent được sử dụng để pha màu widget trong toàn bộ ứng dụng và do đó nên được sử dụng để thống nhất


8
@Tomasz không yêu cầu API 21+ vì chủ đề chính là AppCompat chuyển xuống API 7
TanmayP

Ughhh. Cảm ơn vì điều này, tôi đã sử dụng name="android:colorAccent"nhầm
Jules

29

Nếu bạn đang sử dụng, appcompat-v7:22.1.0+bạn có thể sử dụng DrawableCompat để tô màu các vật dụng của bạn

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

thật là một cứu cánh này thật tuyệt vời, một sự xấu hổ mà nó không được biết rõ
pt123

Hãy di chuyển xuống và xem câu trả lời của tôi cho thư viện thiết kế 23.2.0. Phương pháp này là vô dụng ngay bây giờ.
ywwynm

21

Sử dụng:

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

Điều này sẽ hỗ trợ các thiết bị tiền Lollipop không chỉ +21


@ Powder366, bạn có thể đăng chủ đề chính của ứng dụng không?
bluware

1
<style name = "AppTheme" Parent = "Theme.AppCompat.Light.DarkActionBar">
Powder366

2
@ powder366, hãy thử này: <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">và nó cũng làm việc
blueware

19

<!-- 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>


Nó hoạt động! Khi câu hỏi đặt ra, cần giải quyết theo phong cách / chủ đề, đây phải là câu trả lời đúng.
Ninja

Tôi đồng ý. đây phải là câu trả lời đúng vì đây là một giải pháp toàn cầu
Santacrab

Điều này là bất tiện nếu các điều khiển khác nhau cần màu sắc khác nhau.
Julius

12

Một giải pháp nhanh chóng cho vấn đề của bạn là tìm trong yourappspackage / build / trung gian / exploding-aar / com.android.support / appcompat-v7 / res / drawable / cho abc_edit giác_m vật liệu và sao chép tệp xml đó trong thư mục có thể vẽ của bạn. Sau đó, bạn có thể thay đổi màu của 9 tệp vá từ bên trong bộ chọn này, để phù hợp với sở thích của bạn.


9

Rất dễ dàng chỉ cần thêm android:backgroundTintthuộc tính trong của bạn 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"/>

2
backgroundTint trên API leve 21
Ashwin H

ViewCompat.setBackgroundTintList (editText, ColorStateList.valueOf (Color.YELLOW))
Arst

1
app:backgroundTint="@color/blue"hoạt động trên tất cả các cấp độ api .. mặc dù vì bất kỳ lý do gì, nó vẫn chuyển sang màu khác khi được chọn XD
EpicPandaForce

8

Đây là một phần của mã nguồn TextInputLayouttrong thư viện thiết kế hỗ trợ ( CẬP NHẬT cho phiên bản 23.2.0 ), thay đổi EditTextmàu dòng dưới cùng theo cách đơn giản hơn:

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

Dường như tất cả các mã trên trở nên vô dụng ngay bây giờ trong 23.2.0 nếu bạn muốn thay đổi màu sắc theo chương trình.

Và nếu bạn muốn hỗ trợ tất cả các nền tảng, đây là phương pháp của tôi:

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

AppCompatDrawableManager là gì? setBackground yêu cầu API 16.
CoolMind 22/2/2017

8

Tôi cũng bị mắc kẹt về vấn đề này quá lâu.

Tôi yêu cầu một giải pháp hoạt động cho các phiên bản cả trên và dưới v21.

Cuối cùng tôi đã phát hiện ra một giải pháp rất đơn giản có lẽ không lý tưởng nhưng hiệu quả: Đơn giản chỉ cần đặt màu nền thành transparenttrong các thuộc tính EditText.

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

Tôi hy vọng điều này sẽ giúp ai đó tiết kiệm thời gian.


1
Điều này đang thay đổi toàn bộ màu nền và chúng tôi chỉ muốn thay đổi màu gạch chân.
shahzain ali

@shahzain ali Phần gạch chân của EditText là một nền tảng. Nó sẽ biến mất nếu bạn đặt nó thành null. Và đó là lý do tại sao backgroundTint sẽ hoạt động (nhưng nó sẽ không thay đổi màu khi được kích hoạt)
nyconing

7

Đối với tôi, tôi đã sửa đổi cả AppTheme và giá trị color.xml Cả colorControlN normal và colorAccent đã giúp tôi thay đổi màu đường viền EditText. Cũng như con trỏ và "|" khi bên trong một 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>

Đây là colors.xml

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

Tôi lấy thuộc tính android: textCthonDrawable thành @null mà tôi đã đặt bên trong kiểu editText. Khi tôi thử sử dụng, màu sắc sẽ không thay đổi.


2
Đây sẽ là câu trả lời
Mina Samy

Làm việc như người ở. Cảm ơn
Däñish Shärmà

6

Bạn có thể đặt nền của edittext thành một hình chữ nhật với phần đệm ở bên trái, bên phải và trên cùng để đạt được điều này. Dưới đây là ví dụ 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>

Thay thế hình dạng bằng bộ chọn nếu bạn muốn cung cấp chiều rộng và màu sắc khác nhau cho edittext tập trung.


5

Trong Activit.XML thêm mã

<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"/>

Nơi BackgroundTint=colorcho màu sắc mong muốn của bạn


5

Tôi sử dụng phương pháp này để thay đổi màu của dòng với PorterDuff, không có bản vẽ nào khác.

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

Có một định danh tương tự tồn tại để truy cập vào dòng dưới cùng của một Chỉnh sửa đơn giản?
Rémi P

4

Nếu bạn muốn thay đổi dòng dưới cùng mà không sử dụng màu ứng dụng, hãy sử dụng các dòng này trong chủ đề của bạn:

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

Tôi không biết một giải pháp khác.


4

Tôi đã tìm ra giải pháp khắc phục vấn đề này sau 2 ngày vật lộn, giải pháp dưới đây là hoàn hảo cho những ai muốn thay đổi vài văn bản chỉ thay đổi, chuyển đổi / chuyển màu qua mã java và muốn khắc phục các vấn đề về hành vi khác nhau trên các phiên bản HĐH do sử dụng phương thức 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();
    }
  }
}

Sử dụng trong 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"/>

Thêm dòng trong phong cách

<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>

mã java để chuyển màu

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

2

Tôi hoàn toàn bị cản trở bởi vấn đề này. Tôi đã thử tất cả mọi thứ trong chuỗi này và ở những người khác, nhưng dù tôi có làm gì thì tôi cũng không thể thay đổi màu của gạch chân thành bất cứ thứ gì khác ngoài màu xanh mặc định.

Cuối cùng tôi đã tìm ra những gì đang xảy ra. Tôi đã (không chính xác) sử dụng android.widget.EditTextkhi tạo một phiên bản mới (nhưng phần còn lại của các thành phần của tôi là từ thư viện appcompat). Tôi nên sử dụng android.support.v7.widget.AppCompatEditText. Tôi thay thế new EditText(this)với new AppCompatEditText(this) và vấn đề đã được ngay lập tức giải quyết. Hóa ra, nếu bạn thực sự đang sử dụng AppCompatEditText, nó sẽ chỉ tôn trọng accentColorchủ đề của bạn (như đã đề cập trong một số nhận xét ở trên) và không cần cấu hình bổ sung.


2

Đây là cách dễ nhất và hiệu quả nhất / có thể sử dụng lại / hoạt động trên tất cả các API
Tạo một lớp EditText tùy chỉnh như vậy:

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

Sau đó sử dụng nó như thế này:

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

2

Để thay đổi nền EditText một cách linh hoạt, bạn có thể sử dụng 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);

Tín dụng: Câu trả lời SO này về ColorStateList là tuyệt vời .


Và sử dụng phương pháp nào? setBackgroundTintList? Nó yêu cầu API 21.
CoolMind

setSupportBackgroundTintList cho các phiên bản API cũ hơn.
Ankit Popli

0

Thêm app:backgroundTintcho dưới mức api 21. Nếu không sử dụng android:backgroundTint.

Đối với api dưới cấp 21.

<EditText
     android:id="@+id/edt_name"
     android:layout_width="300dp"
     android:layout_height="wrap_content"
     android:textColor="#0012ff"
     app:backgroundTint="#0012ff"/>

Đối với api cấp 21 cao hơn.

<EditText
     android:id="@+id/edt_name"
     android:layout_width="300dp"
     android:layout_height="wrap_content"
     android:textColor="#0012ff"
     android:backgroundTint="#0012ff"/>

-2

Vui lòng sửa đổi phương pháp này theo nhu cầu của bạn. Điều này làm việc cho tôi!

  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());
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.