Компоненты материала не работают в классе обслуживания (InputmethodService) - InflateException - PullRequest
0 голосов
/ 07 мая 2020

Я пытался раздуть макет xml в представление кандидата InputmethodService onCreateCandidatesView (), файл макета содержит компонент материала ChipGroup. Он генерирует исключение InflateException следующим образом:

 Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.AppCompat (or a descendant).
        at com.google.android.material.internal.ThemeEnforcement.checkTheme(ThemeEnforcement.java:248)
        at com.google.android.material.internal.ThemeEnforcement.checkAppCompatTheme(ThemeEnforcement.java:218)
        at com.google.android.material.internal.ThemeEnforcement.checkCompatibleTheme(ThemeEnforcement.java:153)
        at com.google.android.material.internal.ThemeEnforcement.obtainStyledAttributes(ThemeEnforcement.java:81)
        at com.google.android.material.chip.ChipGroup.<init>(ChipGroup.java:112)
        at com.google.android.material.chip.ChipGroup.<init>(ChipGroup.java:105)
        at java.lang.reflect.Constructor.newInstance0(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343) 
        at android.view.LayoutInflater.createView(LayoutInflater.java:854) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:682) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:534) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:481) 
        at au.com.jschneiderprojects.jkeys.KeyboardService.onCreateCandidatesView(KeyboardService.java:65) 
        at android.inputmethodservice.InputMethodService.prepareWindow(InputMethodService.java:1941) 
        at android.inputmethodservice.InputMethodService.showWindow(InputMethodService.java:1884) 
        at android.inputmethodservice.InputMethodService$InputMethodImpl.showSoftInput(InputMethodService.java:638) 
        at android.inputmethodservice.IInputMethodWrapper.executeMessage(IInputMethodWrapper.java:227) 
        at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:44) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7695) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 

Я реализовал тему Material в базовых стилях. xml

<style name="AppTheme" parent="Theme.MaterialComponents.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

и применил к нему в теге приложения в Manifest

<application
        android:label="@string/app_name"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name=".KeyboardService"
            android:label="CK"
            android:permission="android.permission.BIND_INPUT_METHOD">

            <meta-data
                android:name="android.view.im"
                android:resource="@xml/method"/>

            <intent-filter>
                <action
                    android:name="android.view.InputMethod"/>
            </intent-filter>
        </service>
    </application>

Он отлично работает в классе Activity, но показывает исключение надувания в классе KeyBoardService.

кандидатов. xml которые я пытался надуть в onCreateCandiateView ():

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.chip.ChipGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/colorAccent"
        style="@style/Widget.MaterialComponents.ChipGroup">

    </com.google.android.material.chip.ChipGroup>

</LinearLayout>

И это onCreateCandidateView () класса KeyboardService:

@Override
public View onCreateCandidatesView() {

    LinearLayout layout= (LinearLayout) getLayoutInflater().inflate(R.layout.candidates, null);

    ChipGroup chipGroup=layout.findViewById(R.id.chip_group);

    String[] genres = {"Thriller", "Comedy", "Adventure"};
    for(String genre : genres) {
        Chip chip = new Chip(this);
        chip.setText(genre);
        chipGroup.addView(chip);
    }

    return layout;
}

И зависимость материального дизайна, которую я добавил:

implementation 'com.google.android.material:material:1.1.0'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...