📌  相关文章
📜  com.google.android.material.textfield.TextInputLayout 光标颜色更改 (1)

📅  最后修改于: 2023-12-03 14:59:59.867000             🧑  作者: Mango

修改 com.google.android.material.textfield.TextInputLayout 组件光标颜色

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 是我们自己定义的光标颜色。

第二步:使用一个自定义的 EditText

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 控件,并且无法实现很好的自适应性。在使用时需要谨慎考虑。