Как создать TextInputLayout с OutlineBox программно - PullRequest
0 голосов
/ 25 октября 2018

Я хочу создать TextInputLayout со стилем Widget.MaterialComponents.TextInputLayout.OutlinedBox.Я пробовал много способов, но не смог получить требуемый результат.Вот мой код.

TextInputLayout textInputLayout = new TextInputLayout(getActivity(),null,R.style.Widget_MaterialComponents_TextInputLayout_OutlinedBox);
textInputLayout.setHint("My Hint");
TextInputEditText editText = new TextInputEditText(textInputLayout.getContext());
textInputLayout.addView(editText);
parentView.addView(textInputLayout);

Я также пытался:

TextInputLayout textInputLayout = new TextInputLayout(getActivity(),null,TextInputLayout.BOX_BACKGROUND_OUTLINE);

Я хочу создать вид, подобный этому. enter image description here

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете использовать метод applyStyle, определенный в классе Theme.В Kotlin вы можете получить к нему доступ с помощью свойства theme в экземпляре Context (или подклассе).

Функция applyStyle позволяет добавить стиль к текущей теме, который определяет атрибуты темыссылки на стили.После вызова этого метода вы можете передать атрибут в качестве третьего параметра View, например TextInputLayout, который будет применять требуемые стили при соблюдении темы.

Я использовал эту технику в Splitties (aбиблиотека, которую я создал), и есть некоторая документация плюс примеры, которые должны вам помочь: https://github.com/LouisCAD/Splitties/blob/v3.0.0-alpha02/views-dsl/README.md#using-styles-defined-in-xml

Я еще не добавил поддержку первого класса для тем из Компонентов материалов в DSL-представлениях Splitties Views, но вы можете сделать это самостоятельнои вы даже можете открыть вопрос для обсуждения или внести свой вклад, чтобы он быстрее интегрировался.

0 голосов
/ 26 октября 2018

ОБНОВЛЕНИЕ

Благодаря @Mike M.

Вам необходимо использовать TextInputLayout.setBoxBackgroundMode() метод для использованияСтиль OutlineBox

setBoxBackgroundMode (int boxBackgroundMode)

  • Установка режима для фона поля (заполненный, контур или без).

Тогда вам нужно использовать TextInputLayout.BOX_BACKGROUND_OUTLINE) Константы

ПРИМЕЧАНИЕ: Чтобы получить угол вваш OutlineBox TextInputLayout вам нужно использовать setBoxCornerRadii() метод

SAMPLE CODE

public class MainActivity extends AppCompatActivity {

    LinearLayout parentView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        parentView = findViewById(R.id.parentView);

        TextInputLayout emailTextInputLayout = new TextInputLayout(this, null, R.style.Widget_MaterialComponents_TextInputLayout_OutlinedBox);

        emailTextInputLayout.setHint("Please Enter Email Address");
        emailTextInputLayout.setBoxBackgroundMode(TextInputLayout.BOX_BACKGROUND_OUTLINE);
        emailTextInputLayout.setBoxCornerRadii(5, 5, 5, 5);
        TextInputEditText edtEmail = new TextInputEditText(emailTextInputLayout.getContext());
        emailTextInputLayout.addView(edtEmail);

        parentView.addView(emailTextInputLayout);


        TextInputLayout passTextInputLayout = new TextInputLayout(this, null, R.style.Widget_MaterialComponents_TextInputLayout_OutlinedBox);

        passTextInputLayout.setHint("Please Enter Password");
        passTextInputLayout.setBoxBackgroundMode(TextInputLayout.BOX_BACKGROUND_OUTLINE);
        passTextInputLayout.setBoxCornerRadii(5, 5, 5, 5);
        TextInputEditText edtPass = new TextInputEditText(passTextInputLayout.getContext());
        passTextInputLayout.addView(edtPass);

        parentView.addView(passTextInputLayout);


    }

}

ВЫХОД

enter image description here

На основании этого ответа: /3117463/kak-ustanovit-atribut-stilya-programmno-v-android

  • Динамический стильизменение в настоящее время не поддерживается.Вы должны установить стиль перед созданием представления (в XML).

Это причина того, что TextInputLayout программно не принимает установку стиля рамок в рамке.

Вотпростое решение:

Вы можете использовать LayoutInflater

  • Создание файла макета XML в соответствующих View объектах.

DEMO

Создание нового макета

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.TextInputLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/userIDTextInputLayout"
    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/userIDTextInputEditText"
        android:layout_width="match_parent"
        android:hint="Enter User Name"
        android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>

AndroidX (+ Материальные компоненты для Android ):

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.textfield.TextInputLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/userIDTextInputLayout"
    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp">

    <com.google.android.material.textfield.TextInputEditText 
        android:id="@+id/userIDTextInputEditText"
        android:layout_width="match_parent"
        android:hint="Enter User Name"
        android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>

Теперь, используя LayoutInflater, добавьте TextInputLayout в нужный вам макет

public class MainActivity extends AppCompatActivity {

    LinearLayout rootView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rootView = findViewById(R.id.rootView);

        View view = LayoutInflater.from(this).inflate(R.layout.temp_layout, null);
        TextInputLayout userNameIDTextInputLayout=view.findViewById(R.id.userIDTextInputLayout);
        TextInputEditText userNameInputEditText = view.findViewById(R.id.userIDTextInputEditText);
        userNameIDTextInputLayout.setHint("Please Enter User Name");
        rootView.addView(view);
    }
}

OUTPUT

Screenshot of app with an outlined text input

Примечание

Если вы хотите добавить TextInputLayout из XML, тогда, пожалуйста, проверьте следующий ответ:

Если вы хотите добавить более 5 TextInputLayout s программно, тогда, пожалуйста, подумайте об использовании RecyclerView.Ознакомьтесь со следующими ответами:

Надеюсь, это поможет!

...