programing

appcompat v7을 사용하여 EditText 최종 라인 색상 변경

shortcode 2022. 7. 11. 22:28
반응형

appcompat v7을 사용하여 EditText 최종 라인 색상 변경

Android 5 이하에서 일관된 외관을 얻기 위해 appcompat v7을 사용하고 있습니다.그것은 꽤 잘 작동한다.그러나 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을 사용하는 것 .colorControlActivated ★★★★★★★★★★★★★★★★★」colorControlNormal따라서 이전 스타일의 정의에서 이러한 속성을 덮어쓰려고 했지만 효과가 없습니다.그것을 입니다.appcompat는 그것을 사용하지 않을 것입니다.아쉽게도 마지막 버전의 appcompat 소재 디자인 소스를 찾을 수 없습니다.

이치노 consists은 for for for for for for for for for for for for for for for for for 의 값을 덮어쓰는 것으로 구성되어 있습니다.colorControlActivated,colorControlHighlight ★★★★★★★★★★★★★★★★★」colorControlNormal편집 텍스트 스타일이 아닌 앱 테마 정의에서 사용할 수 있습니다.그리고 이 테마를 여러분이 원하는 어떤 활동에도 사용할 수 있도록 생각해 보세요.하다

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

누군가 편집 텍스트 하나를 바꾸려고 할 때를 대비해서 이 질문에 대한 해답이 필요하다고 느꼈습니다.저는 이렇게 합니다.

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

Laurents 솔루션은 올바르지만, 코멘트에 기술된 바와 같이 몇 가지 결점이 있습니다.그 이유는, 이 솔루션의 최종 결과뿐만 아니라,EditText[Back] (돌아가기)의 [은 Toolbar,CheckBoxes기타 등등.

좋게도v22.1appcompat-v7몇 가지 새로운 가능성을 소개했습니다.이제 특정 테마를 하나의 보기에만 할당할 수 있습니다.Changelog에서 직접:

스타일 지정 도구 모음에 app:theme를 사용하지 않습니다.이제 모든 API 레벨 7 이상의 장치에서 도구 모음에 Android:theme를 사용할 수 있으며 API 레벨 11 이상의 장치에서 모든 위젯에 대한 Android:theme 지원을 사용할 수 있습니다.

글로벌 테마에 하는 것이 새로운 하여 이 만을 에 합니다.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"/>

이것은, XML 로 다음의 방법으로 변경할 수 있습니다.

참조 API > = 21 호환성의 경우:

android:backgroundTint="@color/blue"

하위 API < 21 호환성 사용:

app:backgroundTint="@color/blue"

다음은 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
}

여기에 이미지 설명 입력

도움이 되었으면 좋겠다

허용되는 답변은 스타일별로 조금 더 많지만 가장 효율적인 방법은 다음과 같이 colorAcent 속성을 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"/>

colorAcent 속성은 앱 전체에서 위젯 색칠에 사용되므로 일관성을 위해 사용해야 합니다.

「 」를 사용하고 appcompat-v7:22.1.0+DrawableCompat를 사용하여 위젯을 색칠할 수 있습니다.

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

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

용도:

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

이는 +21 뿐만 아니라 롤리팝 이전의 디바이스에도 대응합니다.

이 문제에 대한 빠른 해결 방법 중 하나는 앱스패키지/빌드/중간/debroaded-aar/com.android를 검색하는 것입니다.abc_edit_text_material.xml에 대해 support/appcompat-v7/res/drawable/를 지정하고 해당 xml 파일을 그리기 가능한 폴더에 복사합니다.그런 다음 원하는 대로 이 선택기 내부에서 9개의 패치 파일의 색상을 변경할 수 있습니다.

요. 추가만 하면 됩니다.android:backgroundTintEditText.

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

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

나 역시 이 문제에 너무 오랫동안 얽매여.

v21 이상 버전 및 이하 버전 모두에서 사용할 수 있는 솔루션이 필요했습니다.

이상적이지는 않지만 효과적인 매우 간단한 솔루션을 마침내 발견했습니다.배경색을 다음과 같이 설정하기만 하면 됩니다.transparent[EditText] 편집하다

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

이걸로 누군가 시간을 절약했으면 좋겠어요.

저는 AppTheme와 값 colors.xml colorControlNormal과 colorAcent 둘 다 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>

editText 스타일 내에 배치한 @null에 android:textCursorDrawable 속성을 삭제했습니다.이걸 써봤더니 색깔이 안 변하더라고요.

편집 텍스트의 배경을 왼쪽, 오른쪽 및 맨 위에 마이너스 패딩이 있는 직사각형으로 설정할 수 있습니다.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>

집중된 편집 텍스트에 다른 너비와 색상을 제공하려면 도형을 선택기로 바꾸십시오.

저는 이틀간의 노력 끝에 이 문제에 대한 효과적인 해결책을 생각해 냈습니다.아래의 솔루션은 편집 텍스트의 일부만 변경하고 자바 코드를 통해 색을 변경/변환하고 싶은 분들과 setColorFilter() 메서드를 사용하여 OS 버전에서 다른 동작의 문제를 극복하고 싶은 분들에게 매우 적합합니다.

    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>

색상을 전환하기 위한 자바 코드

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

[ 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원하는 색상으로

이 방법을 사용하여 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);
}

앱 색상을 사용하지 않고 수익률을 변경하려면 테마에서 다음 행을 사용하십시오.

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

다른 해결책이 없어요.

나는 이 문제에 완전히 당황했다.이 스레드나 다른 스레드에서는 모든 것을 시도해 보았습니다만, 무엇을 해도 디폴트 블루 이외에는 언더 라인의 색을 변경할 수 없었습니다.

나는 마침내 무슨 일이 일어나고 있는지 알아냈다.(잘못해서) 사용하고 있었습니다.android.widget.EditText(단, 나머지 컴포넌트는 Appcompat 라이브러리에서 가져온 것입니다)사용했어야 했는데android.support.v7.widget.AppCompatEditText교체했습니다.new EditText(this)와 함께new AppCompatEditText(this)그 문제는 즉시 해결되었다.알고 보니, 만약 당신이 실제로 그것을 사용하고 있다면,AppCompatEditText 그냥 '하다', '존중하다'라고 할 수 있어요accentColor(위의 여러 코멘트에서 설명한 바와 같이) 추가 설정이 필요 없습니다.

효율적이며 하며 작동합니다.
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"/>

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

크레딧:ColorStateList에 대한 SO의 답변은 훌륭합니다.

app:backgroundTintAPI 벨 、 21 、 api api 。 이외의 경우는, 「」를 사용합니다.android:backgroundTint.

API 레벨 21 이하일 경우.

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

API 레벨 21보다 높은 경우.

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

backgroundTint만 사용하여 편집 텍스트의 밑줄 색상을 변경할 수 있습니다.

 android:backgroundTint="#000000"

예:

 <EditText
          android:id="@+id/title1"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:backgroundTint="#000000" />

이 방법을 필요에 따라 수정해 주세요.나한텐 효과가 있었어!

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

언급URL : https://stackoverflow.com/questions/26574328/changing-edittext-bottom-line-color-with-appcompat-v7

반응형