Проблема: изменить цвет границы или обводку для не сфокусированного TextInputLayout в Android

У меня есть очень специфическая проблема с изменением контура текстового поля для TextInputLayout, когда оно не сфокусировано. Кажется, я не могу найти атрибут для изменения цвета границы моего «расфокусированного» текстового поля.

Вот наглядный пример того, что я пытаюсь сделать:

Цвет этого (текстового поля): граница не белая. в настоящее время он не сфокусирован. После того, как я нажму на нее, она станет белой:

Я не знаю, что мне нужно изменить, не похоже, что есть атрибут, чтобы изменить это.

Я также использую стили макета ввода текста в материальном дизайне, хотя я не вижу, повлияет ли это на это.

Вот мой xml-код для текстового поля:

 <other layouts ... >
     <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:layout_gravity="bottom"
            android:layout_margin="5dp"
            android:background="@drawable/item_recycler_view">

            <android.support.design.widget.TextInputLayout
                android:id="@+id/dialog_text_input_layout"
                style="@style/Widget.AppTheme.TextInputLayoutList"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Quick Add..."
                android:textColorHint="@color/colorWhite"
                app:boxStrokeColor="@color/colorWhite"
                app:errorEnabled="true"
                >

                <android.support.design.widget.TextInputEditText
                    android:id="@+id/dialog_edit_text"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:maxLines="1"
                    android:textColor="@color/colorWhite"
                    android:textSize="14sp" />
            </android.support.design.widget.TextInputLayout>
        </RelativeLayout>
 </other layouts...>

И вот стили, которые я использую для этого:

<style name="TextAppearance.AppTheme.TextInputLayout.HintTextAlt" parent="TextAppearance.MaterialComponents.Subtitle2">
    <item name="android:textColor">@color/colorWhite</item>
</style>

<style name="Widget.AppTheme.TextInputLayoutList" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="hintTextAppearance">@style/TextAppearance.AppTheme.TextInputLayout.HintTextAlt</item>
    <item name="boxStrokeColor">@color/colorWhite</item>
    <item name="boxCornerRadiusBottomEnd">5dp</item>
    <item name="boxCornerRadiusBottomStart">5dp</item>
    <item name="boxCornerRadiusTopEnd">5dp</item>
    <item name="boxCornerRadiusTopStart">5dp</item>
    <item name="android:layout_margin">5dp</item>
</style>

Спасибо, любая помощь или предложения приветствуются!


comment
попробуйте использовать метод установки фокуса   -  person Amjad    schedule 05.09.2018
comment
@Amjad Amjad Я не уверен, что такое метод фокусировки, у вас есть примеры?   -  person Varun Govind    schedule 05.09.2018
comment
если вы хотите, чтобы он был сфокусирован в начале, вы можете установить атрибут   -  person Amjad    schedule 05.09.2018
comment
установка его в фокус не работает :(   -  person Varun Govind    schedule 05.09.2018
comment
Извините, я имею в виду атрибут android:focusedByDefault=true . это будет сосредоточено в начале   -  person Amjad    schedule 06.09.2018
comment
если вы хотите изменить цвет по умолчанию в несфокусированном режиме, посмотрите мой ответ на этот вопрос.   -  person Amjad    schedule 06.09.2018


Ответы (3)


Если вы хотите установить цвет блока контура в нефокусированном режиме вместо черного по умолчанию, вы должны добавить эту строку в файл colors.xml, которая переопределит цвет блока контура по умолчанию.

скопируйте эту строку как есть. вы можете изменить цвет на желаемый.

<color name="mtrl_textinput_default_box_stroke_color">#fff</color>

до сих пор это будет работать, для большего контроля над TextInputLayout вы можете добавить этот стиль в styles.xml

<style name="TextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
    <item name="boxStrokeColor">#fff</item>
    <item name="boxStrokeWidth">2dp</item>
</style>

затем добавьте тему в TextInputLayout

android:theme="@style/TextInputLayoutStyle"
person Amjad    schedule 06.09.2018
comment
О, спасибо! Это сработало для меня! Если я могу спросить, как вы нашли это? - person Varun Govind; 06.09.2018
comment
@VarunGovind добро пожаловать, и надеюсь проголосовать за этот ответ, он мне действительно помогает, для получения дополнительной информации вы можете увидеть обсуждение этой проблемы в github здесь, а для получения дополнительных значений по умолчанию в color.xml вы можете посетить это или посетите дополнительную информацию. - person Amjad; 07.09.2018
comment
не работает для меня. он меняет цвет при выборе, но цвет по умолчанию остается черным - person akshay bhange; 22.03.2019
comment
@akshaybhange, вы можете использовать override в этой команде: <color name="mtrl_textinput_default_box_stroke_color" tools:override="true">#fff</color> - person Aliton Oliveira; 22.05.2019
comment
Как я могу установить то же самое программно? - person Rohan Taneja; 19.06.2019
comment
'‹color name=mtrl_textinput_default_box_stroke_color›#fff‹/color›', но это изменит весь TextInputLayout на белый, что, если я захочу изменить его в отдельном действии или фрагменте? - person Arpan; 28.06.2019
comment
@Arpan Вы нашли способ изменить его только в одном действии или фрагменте? Так как мне тоже нужно менять его цвет только на одном экране. - person Gerrard; 16.07.2019

В библиотеке компонентов материалов просто используйте атрибут boxStrokeColor.
Он может работать с селектором.

Просто используйте что-то вроде:

    <com.google.android.material.textfield.TextInputLayout
        app:boxStrokeColor="@color/text_input_layout_stroke_color"
        ..>

с:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:alpha="..." android:color="@color/...." android:state_focused="true"/>
  <item android:alpha="..." android:color="@color/...." android:state_hovered="true"/>
  <item android:alpha="..." android:color="@color/...." android:state_enabled="false"/>
  <item android:alpha="..." android:color="@color/...."/>  <!-- unfocused -->
</selector>

введите описание изображения здесьвведите здесь описание изображения

person Gabriele Mariotti    schedule 06.02.2020

Ответ Амджада был правильным, но начиная с 1.1.0-alpha02 (вероятно, даже alpha01) после этого проблема была решена, можно определить цвет в списке состояний цвета, используя тот же атрибут boxStrokeColor, например. как это делается в lib:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:color="?attr/colorPrimary" android:state_focused="true"/>
  <item android:alpha="0.87" android:color="?attr/colorOnSurface" android:state_hovered="true"/>
  <item android:alpha="0.12" android:color="?attr/colorOnSurface" android:state_enabled="false"/>
  <item android:alpha="0.38" android:color="?attr/colorOnSurface"/>
</selector>

Использование:

...
app:boxStrokeColor="@color/text_input_layout_stroke_color"
...
person dilix    schedule 25.01.2019
comment
Как добавить этот селектор в TextInputLayout? - person Kavin Raju S; 16.06.2020
comment
Для любого новичка здесь селектор text_input_layout_stroke_color должен быть создан внутри res/color, а НЕ res/drawable - person Andrei Manolache; 27.05.2021