2 votes

AndroidX se bloque sur MultiSelectListPreference

J'ai des difficultés à faire fonctionner les préférences Jetpack/AndroidX avec MultiSelectListPreference . J'ai réduit mon code à projet d'exemple le plus simple ici : https://github.com/quittle/a11y-ally/tree/simple-multi-list .

Pour une raison quelconque, l'activité la plus basique avec un seul fragment de préférence avec une seule MultiSelectListPreference vide se plante en utilisant les classes AndroidX, mais ne se plante pas avec les API Android vanille qui ont été dépréciées dans le niveau 28 du SDK Android.

J'ai trouvé https://code.videolan.org/videolan/vlc-Android/commit/1464d1a6ab882eec78ab3a749e8f06e52bbd7404 Ce qui semble indiquer qu'il peut s'agir d'un problème avec les bibliothèques AppCompat, mais ne corrige pas ma configuration lorsque je l'adapte pour utiliser les bibliothèques AndroidX.

Extraits de code minimaux consommant les préférences

Travaux

public class VanillaMainActivity extends Activity {
    public static class CustomPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }
    }

    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main_activity);

        getFragmentManager()
            .beginTransaction()
            .replace(R.id.preferences_holder, new CustomPreferenceFragment())
            .commit();
    }
}

Crashs

public class AndroidXMainActivity extends FragmentActivity {
    public static class CustomPreferenceFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
            addPreferencesFromResource(R.xml.preferences);
        }
    }

    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main_activity);

        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.preferences_holder, new CustomPreferenceFragment())
                .commit();
    }
}

La trace de pile que j'obtiens lorsque j'utilise la bibliothèque AndroidX est la suivante.

2018-11-05 20:32:22.318 18080-18080/com.example E/com.example: Invalid ID 0x00000000.
2018-11-05 20:32:22.320 18080-18080/com.example E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example, PID: 18080
    android.content.res.Resources$NotFoundException: Resource ID #0x0
        at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:216)
        at android.content.res.Resources.loadXmlResourceParser(Resources.java:2155)
        at android.content.res.Resources.getLayout(Resources.java:1155)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:421)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AlertController$AlertParams.createListView(AlertController.java:989)
        at androidx.appcompat.app.AlertController$AlertParams.apply(AlertController.java:965)
        at androidx.appcompat.app.AlertDialog$Builder.create(AlertDialog.java:982)
        at androidx.preference.PreferenceDialogFragmentCompat.onCreateDialog(PreferenceDialogFragmentCompat.java:158)
        at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:330)
        at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1308)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        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)

0voto

quittle Points 144

Après avoir rempli le rapport de bogue, j'ai été informé que la raison de l'échec était que je n'avais pas de thème App Compat tel que Theme.AppCompat sur l'activité, d'où l'exception de la ressource manquante. Après avoir ajouté cela à l'activité, tout fonctionne comme prévu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X