Я пытался раздуть макет 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'