Как заставить работать AndroidX PreferenceFragmentCompat? (Сбой при базовой реализации) - PullRequest
0 голосов
/ 06 ноября 2019

Я пытался заставить работать самый простой экран Настройки , без какой-либо удачи в течение достаточно долгого времени. Я начал с базового руководства Jetpack по созданию экрана настроек и попытался импровизировать, но ничего не поделаешь. Должен ли я просто подать отчет об ошибке на устройстве отслеживания проблем Android, или я что-то упустил?

Вот что у меня есть:

MySettingsActivity.kt:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class MySettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_preference)
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.container_preferences, MySettingsFragment())
                .commit()
    }
}

Простая схема XML для activity_preference.xml

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

    <FrameLayout
        android:id="@+id/container_preferences"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

Определение действия AndroidManifest.xml для действия настройки:

<activity
    android:name=".meniga.base.MySettingsActivity"
    android:theme="@style/Theme.AppCompat.Light"/>

Простая реализация PreferenceFragmentCompat:

import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat

class MySettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

... и код для простых предпочтений, определенных в файле preferences.xml

<androidx.preference.PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

    <Preference
        app:key="feedback"
        app:title="Send feedback"
        app:summary="Report technical issues or suggest new features"/>

</androidx.preference.PreferenceScreen>

Вот точные реализации, которые я использую в файле build.gradle:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.preference:preference-ktx:1.1.0'

Пока что все скопировано из учебника, но даже в этот момент, когда я запускаю MySettingsActivity.kt, я получаю следующий сбой:

    --------- beginning of crash
2019-11-06 17:17:35.424 12686-12686/com.wrapp.android.debug E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.wrapp.android.debug, PID: 12686
    java.lang.IllegalStateException: Content has view with id attribute 'android.R.id.list_container' that is not a ViewGroup class
        at androidx.preference.PreferenceFragmentCompat.onCreateView(PreferenceFragmentCompat.java:202)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2663)
        at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
        at android.app.Activity.performStart(Activity.java:7165)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2975)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6718)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Я пытался заменитьR.id.container_preferences с android.R.id.list_container, как в XML макета (@android:id/list_container), так и в транзакции менеджера фрагментов, потому что это было упомянуто больше всего в похожих старых вопросах, а также, потому что это то, что является кодом, вызывающим ошибкупытаясьсделать (view.findViewById(AndroidResources.ANDROID_R_LIST_CONTAINER);), но все равно безуспешно. О, а также, он должен быть доступен только для API уровня 24 и выше, что является нарушителем условий, но, в любом случае, это не сработало. Возможно, стоит упомянуть, что я тестирую на Pixel 3XL с Android 9.

Я также попытался использовать PreferenceScreen вместо androidx.preference.PreferenceScreen и заменить app:* на android:* вPreferences.xml, но ничего не изменилось, и я почти уверен, что выдается ошибка, прежде чем раздувать настройки XML.

...