J'essaie de migrer mes anciennes activités de paramètres générées automatiquement (à partir de la galerie d'activités dans Android Studio) vers AndroidX
. Malheureusement, je ne trouve aucune information sur la façon de procéder. La documentation officielle n'est pas très utile, car elle suppose que vous avez déjà tout le code en place pour ajouter vos fragments de préférence et XML
.
J'ai essayé de passer de l'ancien PreferenceScreen
à celui AndroidX
et de PreferenceFragment
à PreferenceFragmentCompat
, mais cela seulement entraîne une exception d'exécution.
Quelqu'un sait-il comment effectuer une telle migration?
3 Réponses :
Accédez à l'option Refactoriser dans le ruban d'Android Studio. Cliquez ensuite sur Migrer vers AndroidX
.
Ajoutez également ces deux lignes dans le fichier build.properties
:
android.useAndroidX=true android.enableJetifier=true
Ces lignes forceront les classes qui ne sont pas déplacées vers AndroidX
à migrer pendant la migration.
Remarque : Veuillez sauvegarder votre projet lorsque vous y êtes invité! Si vous ne savez pas grand-chose sur AndroidX, veuillez sauvegarder votre projet, puis essayez-le!
Malheureusement, cela ne migre pas les préférences.
Pour répondre à ma propre question, cela ne vaut pas la peine de migrer l'activité de préférence existante. Il est plus rapide d'en créer un vide et de définir manuellement des fragments, comme dans la documentation. Tout semble fonctionner dans ce cas et la plupart du code précédent n'est pas utilisé.
J'ai dû migrer un projet existant vers AndroidX.
Je viens donc de passer à PreferenceFragmentCompat
.
Pour vous donner une idée, voici un exemple de code:
Java:
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="@string/PREF_SCR_MAIN"> <androidx.preference.PreferenceCategory android:key="@string/PREF_CAT_MAIN" android:title="@string/pref_cat_main"> <androidx.preference.CheckBoxPreference android:key="@string/TOUCH_TWICE_TO_EXIT" android:summary="@string/pref_sum_touch_twice_to_exit" android:title="@string/pref_title_touch_twice_to_exit" /> </androidx.preference.PreferenceCategory> </androidx.preference.PreferenceScreen
xml:
public class SettingsFragment extends androidx.preference.PreferenceFragmentCompat implements androidx.preference.Preference.OnPreferenceClickListener, androidx.preference.Preference.OnPreferenceChangeListener { // ... your code }
Assurez-vous d'ajouter cette implémentation «androidx.preference: préférence: 1.0.0». Utilisez-vous java ou kotlin?
J'utilise Java et la dépendance est ajoutée.
Oops! désolé, je n'ai aucune référence java, mais j'utilise PreferenceFragmentCompat dans kotlin presque tous les projets. Pouvez-vous partager l'erreur
android.preference.PreferenceActivity.switchToHeaderInner ()
lanceandroid.app.Fragment $ InstantiationException: tentative d'instanciation d'une classe xxx.SettingsActivity $ GeneralPreferenceFragment qui n'est pas un fragment