📅  最后修改于: 2023-12-03 14:59:59.867000             🧑  作者: Mango
com.google.android.material.textfield.TextInputLayout
是谷歌官方提供的一个Material Design样式的文本输入框布局控件,它可以简单地实现带有浮动标签的输入框。但是这个控件本身并没有提供直接设置光标颜色的属性,下面讲解一下如何通过一定的技巧实现修改光标颜色。
在修改 com.google.android.material.textfield.TextInputLayout
控件的光标颜色之前,我们需要先改变系统主题的光标颜色。这个可以在styles.xml
文件中进行设置,如下:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Customize your theme here. -->
<!-- ... -->
<item name="colorControlActivated">@color/my_cursor_color</item>
</style>
</resources>
其中,my_cursor_color
是我们自己定义的光标颜色。
com.google.android.material.textfield.TextInputLayout
控件实际上包含了一个 EditText
控件,并且默认情况下其背景为透明色。因此,我们可以通过在 TextInputLayout
控件内添加一个自定义的 EditText
控件,来达到修改光标颜色的目的。
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/text_input_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter your name"
app:boxBackgroundColor="@color/white"
app:boxBackgroundMode="outline"
app:boxStrokeColor="@color/my_box_stroke_color"
app:boxStrokeWidth="1dp"
app:errorEnabled="true">
<com.example.myapp.MyEditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:textColor="@color/black" />
</com.google.android.material.textfield.TextInputLayout>
可以看到,我们在 TextInputLayout
控件内添加了一个自定义的 MyEditText
控件。这个控件继承自 EditText
控件,但是我们在其中重写了其获取焦点时光标颜色的方法:
public class MyEditText extends AppCompatEditText {
public MyEditText(Context context) {
super(context);
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
if (hasFocus()) {
setHighlightColor(getResources().getColor(R.color.my_cursor_color));
} else {
setHighlightColor(getResources().getColor(android.R.color.transparent));
}
}
}
这个方法在 EditText
控件获取焦点时会被调用,我们在其中设置了光标颜色为我们自己定义的颜色。同时为了避免在没有焦点的时候闪烁,我们将高亮颜色设置为透明色。
最后,我们还需要在布局文件中将原来的 EditText
控件的背景设置为透明色,这样才能看到我们自己添加的自定义控件的光标颜色。
<com.google.android.material.textfield.TextInputLayout
...
>
<EditText
...
android:background="@color/transparent"/>
</com.google.android.material.textfield.TextInputLayout>
现在运行代码,即可看到我们成功修改了 com.google.android.material.textfield.TextInputLayout
控件的光标颜色。
上述的方法虽然可以修改 com.google.android.material.textfield.TextInputLayout
控件的光标颜色,但是比较麻烦,需要自定义 EditText
控件,并且无法实现很好的自适应性。在使用时需要谨慎考虑。