Question Comment utiliser la bibliothèque v7 / v14 Preference Support?


Avec la version M, il existe de nouvelles bibliothèques de support. L'un d'entre eux qui semble être très utile est le v7 Support des préférences bibliothèque.

Il ne semble pas avoir PreferenceActivity ou quelque chose de similaire, comment pouvons-nous l'intégrer à notre application?


50
2017-08-18 10:43


origine


Réponses:


Il faut étendre AppCompatActivity, qui est requis pour fragment, et comprend une sous-classe de PreferenceFragmentCompat. Le fragment abstrait doit remplacer une méthode, dans laquelle vous devez placer votre logique d'inflation des préférences. Enfin, le thème de votre activité doit spécifier un preferenceTheme attribut.

Lire l'annonce ici. Avec la bibliothèque preference-v7, vous pouvez remplacer PreferenceFragment (API 11+) avec PreferenceFragmentCompat sous-classe, et SwitchPreference (API 14+) avec SwitchPreferenceCompat et que votre écran de paramétrage fonctionne à partir de l’API 7.

Voici comment je l'ai fait fonctionner:

SettingsActivity.java

public class SettingsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
    }
}

layout / activity_settings.xml

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

SettingsFragment.java

public class SettingsFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle bundle, String s) {
        addPreferencesFromResource(R.xml.preferences);
    }
}

xml / preferences.xml

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

    <android.support.v7.preference.PreferenceCategory
        ...>

        <android.support.v7.preference.ListPreference
            ... />

        <android.support.v7.preference.SwitchPreferenceCompat
            ... />

        ...

    </android.support.v7.preference.PreferenceCategory>

    ...

</android.support.v7.preference.PreferenceScreen>

values ​​/ styles.xml

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
    ...
</style>

thème par défaut preference-v7

<style name="PreferenceThemeOverlay">
    <item name="preferenceScreenStyle">@style/Preference.PreferenceScreen</item>
    <item name="preferenceFragmentStyle">@style/PreferenceFragment</item>
    <item name="preferenceCategoryStyle">@style/Preference.Category</item>
    <item name="preferenceStyle">@style/Preference</item>
    <item name="preferenceInformationStyle">@style/Preference.Information</item>
    <item name="checkBoxPreferenceStyle">@style/Preference.CheckBoxPreference</item>
    <item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat</item>
    <item name="dialogPreferenceStyle">@style/Preference.DialogPreference</item>
    <item name="editTextPreferenceStyle">@style/Preference.DialogPreference.EditTextPreference</item>
    <item name="preferenceFragmentListStyle">@style/PreferenceFragmentList</item>
</style>

87
2017-10-03 06:39



Avec la nouvelle bibliothèque de support de préférences v7, vous pouvez utiliser le PréférenceFragmentCompat avec tout Activity ou AppCompatActivity

public static class PrefsFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
}

Vous devez définir preferenceTheme dans votre thème:

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  ...
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

De cette façon, vous pouvez personnaliser le preferenceTheme pour styliser les mises en page utilisées pour chaque type de préférence sans affecter les autres parties de votre activité.


10
2017-08-31 06:43



La réponse de hidro est juste mais une autre chose à noter ici:

Utilisez simplement les balises xml de préférence normale telles que PreferenceScreen au lieu du nom de classe complet. La bibliothèque de support les convertira automatiquement.

Pourquoi: Si vous utilisez le nom complet de la classe, la suggestion de code et la prévisualisation de la mise en page ne fonctionneront pas correctement.

Donc, vous devriez écrire xml comme ceci:

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

    <PreferenceCategory
        ...>

        <ListPreference
            ... />

        <SwitchPreferenceCompat
            ... />

        ...

    </PreferenceCategory>

    ...

</PreferenceScreen>

9
2018-02-07 11:11



Vous avez raison, cela n’existe pas sur l’appcompat v7, mais Google a en fait ajouté AppCompatDelegate classe abstraite en tant que délégué que vous pouvez utiliser pour injecter le support de AppCompat dans n'importe quelle activité. Vous pouvez trouver plus de cette réponse.

Ceci est un exemple de comment injecter le AppCompatDelegate dans votre activité à partir des exemples de Google AppCompat, vous pouvez le trouver ici.


0
2017-08-18 10:51



J'ai essayé d'implémenter la réponse d'Hidro ci-dessus avec une activité qui contenait également une barre d'outils et cela m'a donné une exception d'inflation de mise en page à cause de l'erreur suivante:

Causé par: java.lang.NullPointerException: tentative d’appel virtuel   méthode       'android.content.Context android.support.v4.app.FragmentHostCallback.getContext ()'       sur une référence d'objet nulle

Je n'ai pas pu résoudre ces problèmes, j'ai donc eu recours à ce qui suit:

public class SettingsActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  if(savedInstanceState == null)
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new SettingsFragment()).commit();
  }
}

Avec la disposition suivante pour SettingsActivity:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:fitsSystemWindows="true">
  <include layout="@layout/toolbar"/>
  <FrameLayout android:id="@+id/fragment_container"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>

Publié ici car cela peut aider si d'autres personnes rencontrent la même exception


0
2018-04-26 10:53