O estilo desse componente exige que o tema do seu aplicativo seja Theme.MaterialComponents (ou um descendente)

8

Eu sou novo no Android e talvez eu tenha uma pergunta boba / burra. Eu tenho uma atividade em que quero criar dinamicamente vários campos de entrada. A quantidade de campos de entrada é definida pelo usuário.

Como a entrada é estilizada e consiste em 2 elementos e não queria criar esses elementos todas as vezes, porque os elementos têm vários parâmetros iguais sempre. É por isso que eu criei um arquivo XML apenas para esses dois elementos que eu gostaria de usar no meu programa para criar as entradas.

View_input.xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/textInputLayoutTableName"
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="10dp"
        android:hint="@string/create_table_name"
        android:inputType="text"
        app:boxStrokeColor="@color/colorAccent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:placeholderText="@string/create_table_table_name_placeholder"
        app:startIconTintMode="src_in">
        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/textInputName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="text"
            android:text="" />
    </com.google.android.material.textfield.TextInputLayout>
</merge>

Meu XML de destino ( activity_create_table_column_names.xml ) fica assim:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout         
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.createtable.CreateTableColumnNamesActivity">

<LinearLayout
    android:id="@+id/columnNameInputContainer"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:gravity="start"
    android:orientation="vertical"
    android:padding="20dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/create_table_column_names"
    android:textStyle="bold" />

    <!-- HERE --> 
</LinearLayout>

Onde escrevi, <!-- HERE -->quero que todos os meus campos de entrada estejam.

Comecei apenas exibindo uma entrada:

private fun initLayout() {
    val container = findViewById<LinearLayout>(R.id.columnNameInputContainer)
    val inflater = applicationContext
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    val view = inflater.inflate(R.layout.view_input, LinearLayout(this))
    container.addView(view)
}

Mas eu tenho a seguinte exceção:

Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant).
at com.google.android.material.internal.ThemeEnforcement.checkTheme(ThemeEnforcement.java:243)
at com.google.android.material.internal.ThemeEnforcement.checkMaterialTheme(ThemeEnforcement.java:217)
at com.google.android.material.internal.ThemeEnforcement.checkCompatibleTheme(ThemeEnforcement.java:145)
at com.google.android.material.internal.ThemeEnforcement.obtainTintedStyledAttributes(ThemeEnforcement.java:115)
at com.google.android.material.textfield.TextInputLayout.<init>(TextInputLayout.java:458)
at com.google.android.material.textfield.TextInputLayout.<init>(TextInputLayout.java:417)

Meus estilos.xml

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
        ...
    </style>
</resources>

O que estou fazendo errado? É esta a maneira correta de programar algo assim?

Editar : Android.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="de.hsos.ma.adhocdb">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:appComponentFactory="@string/app_name"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:appComponentFactory">
        <activity
            android:name=".ui.createtable.CreateTableColumnNamesActivity"
            android:parentActivityName=".ui.homescreen.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.createtable.CreateTableActivity"
            android:parentActivityName=".ui.homescreen.MainActivity" />
        <activity
            android:name=".ui.homescreen.TestTableActivity"
            android:parentActivityName=".ui.homescreen.MainActivity">

            <!--
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            -->
        </activity>
        <activity
            android:name=".ui.TableShow.TableShowActivity"
            android:parentActivityName=".ui.homescreen.MainActivity" />
        <activity android:name=".ui.tablelist.LayoutTableListItem" />
        <activity android:name=".ui.homescreen.MainActivity">

        </activity>
    </application>

</manifest>
Barney Stinson
fonte
você pode postar seu AndroidManifest.xmlconteúdo
Mohammed Alaa
@MohammedAlaa sim, eu adicionei o manifesto na parte inferior do meu post
Barney Stinson

Respostas:

1

encontrou a solução, obtenha seu inflator da atividade, não da aplicação, apenas modifique-o initLayout()assim

// here is the fix
val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
Mohammed Alaa
fonte
que funcionou obrigado !!! @MohammedAlaa, você sabe como posso ler o texto das diferentes entradas ("@ + id / textInputName") se criar várias entradas?
Barney Stinson
verifique isso é o mesmo, também, se a resposta que você ajudou, você pode aceitá-la assim quando procurar outros para o mesmo problema que pode encontrar a solução
Mohammed Alaa
1
Obrigado pelo seu tempo! Acabei de adicionar todas as visualizações de texto em uma matriz ao criar a exibição e que funcionou para mim!
Barney Stinson