Phong cách trên thành phần này yêu cầu chủ đề ứng dụng của bạn phải là Theme.M vật liệu tổng hợp (hoặc hậu duệ)


8

Tôi mới sử dụng Android và tôi có thể có một Câu hỏi ngớ ngẩn / ngu ngốc. Tôi đã có một Hoạt động nơi tôi muốn tự động tạo Nhiều trường nhập liệu. Số lượng Trường đầu vào được xác định bởi Người dùng.

Bởi vì Đầu vào được tạo kiểu và Bao gồm 2 phần tử và không muốn tạo các phần tử này mỗi lần vì các phần tử có nhiều tham số giống nhau mỗi lần. Đó là lý do tại sao tôi đã tạo một tệp XML chỉ cho hai Phần tử mà tôi muốn sử dụng trong Chương trình của mình để tạo Đầu vào.

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>

XML mục tiêu của tôi ( Activity_create_table_column_names.xml ) trông như thế này:

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

Nơi tôi đã viết, <!-- HERE -->tôi muốn tất cả các Trường đầu vào của mình được.

Tôi bắt đầu chỉ bằng cách hiển thị một Đầu vào:

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

Nhưng tôi đã có Ngoại lệ sau:

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)

Styles Styles của tôi

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

Tôi đang làm gì sai? Đây có phải là cách chính xác tôi nên lập trình một cái gì đó như thế này?

Chỉnh sửa : 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>

bạn có thể đăng AndroidManifest.xmlnội dung của mình không
Mohammed Alaa

@MohammedAlaa vâng tôi đã thêm bảng kê khai ở cuối bài đăng của tôi
Barney Stinson

Câu trả lời:


1

Tìm thấy giải pháp, lấy máy bơm của bạn từ hoạt động chứ không phải ứng dụng chỉ sửa đổi initLayout()như thế này

// here is the fix
val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

đã làm việc cảm ơn !!! @MohammedAlaa bạn có biết làm thế nào tôi có thể đọc văn bản của các đầu vào khác nhau ("@ + id / textInputName") nếu tôi tạo nhiều đầu vào không?
Barney Stinson

kiểm tra này nó giống nhau, còn nếu câu trả lời giúp bạn, bạn có thể chấp nhận nó vì thế khi những người khác tìm kiếm cùng một vấn đề họ có thể tìm ra giải pháp
Mohammed Alaa

1
cảm ơn vì đã dành thời gian cho tôi! tôi vừa thêm tất cả các đoạn văn bản trong một mảng trong khi tạo khung nhìn và điều đó làm việc cho tôi!
Barney Stinson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.