在Android中,根据焦点更改EditText背景基线颜色

31

我需要设计一个带有基线的EditText,如下图所示,并在其获得焦点时将其颜色更改为其他颜色!

enter image description here

我正在使用以下内容。

 <EditText    
    android:id="@+id/mobilenumber" 
    android:drawableLeft="@drawable/mobile"
    android:drawablePadding="15dp" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:background="@drawable/edt_bg"
    android:singleLine="true"
    android:textColorHint="#FFFFFF"
    android:hint="@string/mobilenumber"
    android:layout_marginTop="20dp"
    android:layout_gravity="center"
    android:padding="5dp"
    android:imeOptions="actionNext"
    android:maxLength="10"
    android:textColor="#ffffff"
    android:textCursorDrawable="@null"

    />

所以,请指导我如何处理这个问题。


阅读有关XML中<StateListDrawable>标签的<selector>的内容。 - pskink
你能否对此提供一些清晰的想法? - koti
6个回答

71

您可以为EditText添加主题

<style name="EditTextTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorControlNormal">@color/primary</item>
    <item name="colorControlActivated">@color/primary</item>
    <item name="colorControlHighlight">@color/primary</item>
</style>

你可以将其用作EditText中的

<EditText
    android:id="@+id/edtCode"
    android:layout_width="match_parent"
    android:layout_height="40dp"
   .......................
    android:theme="@style/EditTextTheme">

</EditText>

1
如果您想控制在选择字段时,当提示上升到字段上方时的颜色,请将相同的主题添加到包装EditText的TextInputLayout中。 - Andy Weinstein
1
这会在OPPO设备上崩溃。在样式中删除colorControl参数可以解决此问题。正在尝试找到更好的解决方案。 - Viswanath Kumar Sandu
我该如何动态设置EditText的主题? - Jaimin Modi

19

将此应用于您的editText样式中

<item name="backgroundTint">@color/focus_tint_list</item>

焦点着色列表 focus_tint_list.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_focused="true" android:color="?attr/colorAccent"/>

   <item android:state_focused="false" android:color="#999999"/>

</selector>

1
你应该把文件focus_tint_list.xml放在哪里? - D2TheC
4
在res中创建color资源目录,然后在color目录中创建focus_tint_list颜色资源。 - Slashbin
我该如何将动态创建的主题设置到EditText上?我该怎么做才能动态地设置这个主题。 - Jaimin Modi

6

尝试使用Holo Color生成器自定义颜色。

Android Holo Colors

您可以创建选择器并将其设置为EditText的背景。

res/drawable/edit_text.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_window_focused="false"
        android:state_enabled="true"
        android:drawable="@drawable/textfield_default" />

    <item
        android:state_window_focused="false"
        android:state_enabled="false"
        android:drawable="@drawable/textfield_disabled" />

    <item
        android:state_pressed="true"
        android:drawable="@drawable/textfield_pressed" />

    <item
        android:state_enabled="true"
        android:state_focused="true"
        android:drawable="@drawable/textfield_selected" />

    <item
        android:state_enabled="true"
        android:drawable="@drawable/textfield_default" />

    <item
        android:state_focused="true"
        android:drawable="@drawable/textfield_disabled_selected" />

    <item
        android:drawable="@drawable/textfield_disabled" />

</selector>

布局:

<EditText    
    android:id="@+id/mobilenumber"
    ....
    android:background="@drawable/edit_text" />

不错的回答。你的 XML 代码缺少 </selector> 标签。除此之外 - 谢谢兄弟! - Alexey Shevelyov

2
我需要同样的东西,我是这样解决的:

我需要同样的东西,我是这样解决的:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_focused="true" android:state_window_focused="true">
   <shape>
     <stroke android:color="@color/blue_500" android:width="2dp" />
     <corners android:radius="45dp"/>
   </shape>
</item>
<item android:state_focused="false" android:state_window_focused="false">
  <shape>
    <stroke android:color="@color/grey_600" android:width="2dp"/>
    <corners android:radius="45dp"/>
  </shape>
</item>
</selector>

感谢最佳答案。 - blackHawk
我们需要在哪里为EditText的基线设置这个选择器文件? - gingerNinja

0

如果想要在EditText获得焦点时更改其基线,您可以直接进入项目中的colors.xml文件并更改"colorAccent"的值。

res/values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<color name="colorAccent">#DESIRED_COLOR</color>
</resources>`

0
你可以通过以下步骤以编程方式完成:
1- 在“res”目录下创建一个名为“color”的文件夹 2- 创建一个XML选择器文件,其中包含颜色的焦点状态,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:color="#535353"/>
    <item android:state_focused="false" android:color="#CCCCCC"/>
</selector>

3- 使用这个代码:
val colorStateList = ContextCompat.getColorStateList(context, R.color.focus_tint_list)
ViewCompat.setBackgroundTintList(editText, colorStateList) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接