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.1
appcompat-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: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"/>
입니다.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:backgroundTint
API 벨 、 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
'programing' 카테고리의 다른 글
ES6 구문을 사용하여 vue에서 여러 구성 요소를 가져올 수 없음 (0) | 2022.07.11 |
---|---|
Vue 3 스토어를 Vuex 없이 유지하는 방법 (0) | 2022.07.11 |
%*의 형식 지정자는 무엇을 의미합니까? (0) | 2022.07.11 |
두 개의 명명된 vuex 모듈 간에 작업을 디스패치하는 방법이 있습니까? (0) | 2022.07.11 |
Larabel 백엔드를 사용하여 풀스택 Vue 프런트엔드를 사용하여 로그인/로그아웃하는 방법 (0) | 2022.07.11 |