Für den Stil dieser Komponente muss Ihr App-Design Theme.MaterialComponents (oder ein Nachkomme) sein.

8

Ich bin neu in Android und ich könnte eine dumme / dumme Frage haben. Ich habe eine Aktivität, in der ich dynamisch mehrere Eingabefelder erstellen möchte. Die Anzahl der Eingabefelder wird vom Benutzer festgelegt.

Weil die Eingabe so gestaltet ist und aus 2 Elementen besteht und diese Elemente nicht jedes Mal erstellen wollte, weil Elemente mehrere Parameter haben, die jedes Mal gleich sind. Deshalb habe ich eine XML-Datei nur für diese beiden Elemente erstellt, die ich in meinem Programm zum Erstellen der Eingaben verwenden möchte.

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>

Mein Ziel-XML ( activity_create_table_column_names.xml ) sieht folgendermaßen aus:

<?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>

Wo ich geschrieben habe, <!-- HERE -->möchte ich, dass alle meine Eingabefelder sind.

Ich begann damit, nur einen Eingang anzuzeigen:

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)
}

Aber ich habe die folgende Ausnahme:

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)

Meine Styles.xml

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

Was mache ich falsch? Ist das überhaupt die richtige Art, wie ich so etwas programmieren sollte?

Bearbeiten : 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
quelle
Kannst du deinen AndroidManifest.xmlInhalt posten?
Mohammed Alaa
@MohammedAlaa Ja, ich habe das Manifest am Ende meines Beitrags hinzugefügt
Barney Stinson

Antworten:

1

Wenn Sie die Lösung gefunden haben, holen Sie sich Ihren Inflator aus der Aktivität und nicht aus der Anwendung. Ändern Sie einfach Ihre Angaben initLayout()wie folgt

// here is the fix
val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
Mohammed Alaa
quelle
das hat funktioniert danke !!! @MohammedAlaa Weißt du, wie ich den Text der verschiedenen Eingaben ("@ + id / textInputName") lesen kann, wenn ich mehrere Eingaben erstelle?
Barney Stinson
überprüfen diese es ist das gleiche, auch wenn die Antwort Ihnen geholfen, können Sie es so akzeptieren , wenn andere für die gleiche Problem suchen sie die Lösung finden
Mohammed Alaa
1
vielen Dank für Ihre Zeit! Ich habe gerade alle Textansichten in einem Array hinzugefügt, während ich die Ansicht erstellt habe, und das hat bei mir funktioniert!
Barney Stinson