[java] appcompat v7을 사용하여 EditText 하단 선 색상 변경

appcompat v7을 사용하여 Android 5 이하에서 일관된 모양을 얻습니다. 오히려 잘 작동합니다. 그러나 EditText의 결론 색상과 악센트 색상을 변경하는 방법을 알 수 없습니다. 가능합니까?

사용자 정의를 정의하려고 시도했지만 android:editTextStyle(아래 참조) 전체 배경색 또는 텍스트 색상 만 변경했지만 결론이나 악센트 색상은 변경하지 못했습니다. 사용할 특정 속성 값이 있습니까? android:background속성을 통해 사용자 정의 드로어 블 이미지를 사용해야 합니까? 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>

안드로이드 API 21 소스에 따르면, 머티리얼 디자인의 EditTexts는 colorControlActivated및 을 사용하는 것으로 보입니다 colorControlNormal. 따라서 이전 스타일 정의에서 이러한 속성을 재정의하려고 시도했지만 아무런 효과가 없습니다. 아마도 appcompat는 그것을 사용하지 않습니다. 불행히도, 머티리얼 디자인의 마지막 버전의 appcompat에 대한 소스를 찾을 수 없습니다.



답변

마지막으로 해결책을 찾았습니다. 그것은 단순히 값을 오버라이드 (override)으로 구성 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);


답변

하지만 로렌 솔루션이 올바른지, 그것은이의 하단 라인뿐만 아니라 이후의 주석에 설명 된대로 몇 가지 단점이 함께 제공 EditText착색됩니다 만의 뒤로 버튼 Toolbar, CheckBoxes뿐만 아니라 등.

운 좋게도 몇 가지 새로운 가능성 v22.1appcompat-v7소개되었습니다. 이제 특정 테마를 하나의보기에만 지정할 수 있습니다. 변경 로그 에서 바로 :

툴바 스타일링에 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
}

여기에 이미지 설명을 입력하십시오

도움이되기를 바랍니다.


답변

허용되는 답변은 스타일별로 조금 더 있지만, 가장 효율적인 방법은 AppTheme 스타일에 다음과 같이 colorAccent 속성 을 추가하는 것입니다.

<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 속성은 앱 전체에서 위젯 색조에 사용되므로 일관성에 사용해야합니다.


답변

당신이 사용하는 경우 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);
    }