Установить стиль представления программно Kotlin - PullRequest
0 голосов
/ 12 марта 2020

Я искал много ответов, но не нашел никакого рабочего решения. Интересно, есть ли возможность установить стиль Edittext программно. В моей ситуации у меня есть один макет, который включен и используется в двух разных местах, и кроме места, где он включен, нужно использовать другой стиль.

<style name="TestStyle1" parent="Widget.AppCompat.EditText">
    <item name="android:maxLength">1</item>
    <item name="android:singleLine">true</item>
</style>

<style name="TestStyle2" parent="CodeTextStyle">
    <item name="android:alpha">0.5</item>
</style>

first_activity. xml

  <include
        layout="@layout/custom_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

second_activity. xml

  <include
        layout="@layout/custom_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

custom_layout. xml

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <CustomEditText
        android:id="@+id/et"
        app:style_ref="@style/CustomTextStyle"
        style="@style/TestStyle1" <-- Here i need to change style beside of usage
        android:layout_height="wrap_content" />
</LinearLayout>

CustomEditText.kt

class CustomEditText @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : AppCompatEditText(context, attrs) {

init {
    val typedArray = context.theme.obtainStyledAttributes(attrs, R.styleable.CustomEditText, 0 , 0)
    try {

        val style2 = typedArray.getResourceId(R.styleable.CustomEditText_style_ref, 0)

        setTypeface(Typeface.DEFAULT, style2)
        invalidate()
    }
}

}

1 Ответ

0 голосов
/ 13 марта 2020

Таким образом, самым простым способом, если ваш минимальный уровень API равен 23, было бы получить ссылку на каждый экземпляр CustomEditText после инфляции соответствующего макета активности, а затем просто установить

myCustomEditText.setTextAppearance(R.style.TestStyle1)

, как описано в * 1004. * этот ответ (который использует устаревшую версию)

Другой вариант - применить два стиля к двум соответствующим стилям темы приложения, которые можно установить для каждого действия в AndroidManifest.

Или вы можете go более сложный путь, который я предложил в своем комментарии: создайте собственный класс LinearLayout и передайте стиль в конструкторе:

class CustomLayout(context: Context) : LinearLayout(context, null, R.style.TestStyle1)

Вам просто нужно выяснить способ сообщить макету, какой вид деятельности он создан. Насколько я знаю, этот стиль будет затем передаваться каждому дочернему представлению, вашему CustomEditText соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...