изменить цвет фона текстового представления в соответствии с формой текстового представления при нажатии на текстовое представление

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

 <com.google.android.material.textview.MaterialTextView
        android:id="@+id/textViewLoseWeight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="65dp"
        android:text="Lose Weight"
        android:textColor="@color/purple_500"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textViewGoals"
        tools:ignore="MissingConstraints" />

    <com.google.android.material.textview.MaterialTextView
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:layout_marginTop="4dp"
        android:id="@+id/textViewLoseWeightSubtitle"
        android:background="@drawable/textview_outline_style"
        android:paddingStart="16dp"
        android:paddingTop="16dp"
        android:text="Get leaner and improve Your fitness"
        android:textColor="@color/purple_500"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textViewLoseWeight" />



 //.java
    View.OnClickListener listener = new View.OnClickListener() {
            @SuppressLint("NonConstantResourceId")
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.textViewLoseWeightSubtitle:
                        mLoseWgt.setBackgroundColor(Color.parseColor("#363C60"));
                        mLoseWgt.setTextColor(Color.WHITE);

Это текстовое представление, фон и цвет текста которого я хочу изменить

После того, как я нажму на него, цвет фона изменится, но выйдет за пределы формы

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


person Mubashar Hassan Minhas    schedule 08.04.2021    source источник
comment
пожалуйста, добавьте свои макеты XML, чтобы получить лучший обзор. Спасибо   -  person DEX7RA    schedule 08.04.2021
comment
Предполагая, что mLoseWgt является View, попробуйте установить mLoseWgt.setClipToOutline(true)   -  person emkarachchi    schedule 08.04.2021
comment
это не работает   -  person Mubashar Hassan Minhas    schedule 08.04.2021


Ответы (2)


Вы определяете свой TextView, а также его атрибут android:background:

 <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Get leaner and improve Your fitness"
            android:background="@drawable/round_fill_color"
            android:layout_centerInParent="true"
            android:textColor="#ffffff"
            android:padding="10dp"/>
    
    </RelativeLayout>

А вот упомянутый атрибут в новом drawable называется round_fill_color.xml:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#363c60"/>
    <stroke android:width="3dp" android:color="#ffffff" />
    <corners android:radius="30dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

Это предлагаемый способ создания пользовательских атрибутов для одного widgets.

Если вы хотите определить один layout для всех, я рекомендую сделать это поверх styles.xml и themes.

Результат:

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

person DEX7RA    schedule 08.04.2021

Вы можете использовать что-то другое:

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/textview"
             ../>

а затем примените MaterialShapeDrawable

    val radius = resources.getDimension(R.dimen.default_corner_radius)

    val shapeAppearanceModel = ShapeAppearanceModel()
        .toBuilder()
        .setAllCorners(CornerFamily.ROUNDED, radius)
        .build()

    val shapeDrawable = MaterialShapeDrawable(shapeAppearanceModel)
    shapeDrawable.fillColor = ContextCompat.getColorStateList(this,R.color.xxx)
    shapeDrawable.setStroke(2.0f, ContextCompat.getColor(this,R.color.xx));
    ViewCompat.setBackground(textView, shapeDrawable)

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

Используйте этот ShapeAppearanceModel, чтобы скруглить углы на 50%:

val shapeAppearanceModel = ShapeAppearanceModel()
    .toBuilder()
    .setAllCorners(RoundedCornerTreatment())
    .setAllCornerSizes(RelativeCornerSize(0.5f))
    .build()

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

person Gabriele Mariotti    schedule 08.04.2021