web-dev-qa-db-de.com

Wie benutze ich die v7 / v14 Preference Support Bibliothek?

Zusammen mit dem M-Release gibt es neue Unterstützungsbibliotheken. Eine davon, die sehr nützlich zu sein scheint, ist die Bibliothek v7 Preference Support .

Es scheint kein PreferenceActivity oder ähnliches zu haben, wie integrieren wir es in unsere App?

53

Sie müssen AppCompatActivity, das für das Fragment erforderlich ist, erweitern und eine Unterklasse von PreferenceFragmentCompat einschließen. Das abstrakte Fragment muss eine Methode überschreiben, in die Sie Ihre bevorzugte Inflationslogik einfügen sollten. Zuletzt muss Ihr Aktivitätsthema ein preferenceTheme -Attribut angeben.

Lesen Sie die Ankündigung hier . Mit der Preference-v7-Bibliothek können Sie PreferenceFragment (API 11+) durch PreferenceFragmentCompat Unterklasse und SwitchPreference (API 14+) durch SwitchPreferenceCompat und lassen Sie Ihren Einstellungsbildschirm von API 7 aus arbeiten.

Nachfolgend ist aufgeführt, wie ich es zum Laufen gebracht habe:

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>

Präferenz v7 Standarddesign

<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>
92
hidro

die Antwort von hidro ist richtig, aber noch eine Sache, die zu beachten ist:

Verwenden Sie einfach normale XML-Tags wie PreferenceScreen anstelle des vollständigen Klassennamens. Die Support-Bibliothek konvertiert sie automatisch.

Warum: Wenn Sie den vollständigen Klassennamen verwenden, funktionieren der Codevorschlag und die Layoutvorschau nicht ordnungsgemäß.

Also solltest du xml so schreiben:

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

    <PreferenceCategory
        ...>

        <ListPreference
            ... />

        <SwitchPreferenceCompat
            ... />

        ...

    </PreferenceCategory>

    ...

</PreferenceScreen>
12
Junyue Cao

Mit der neuen Preference Support Library v7 können Sie PreferenceFragmentCompat mit jedem Activity oder AppCompatActivity verwenden.

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);
    }
}

Du musst preferenceTheme in deinem Theme setzen:

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

Auf diese Weise können Sie das preferenceTheme anpassen, um die für jeden Einstellungstyp verwendeten Layouts zu gestalten, ohne andere Teile Ihrer Aktivität zu beeinflussen.

9

Ich habe versucht, die obige Antwort von Hidro mit einer Aktivität zu implementieren, die auch eine Symbolleiste enthielt. Aufgrund des folgenden Fehlers gab es folgende Ausnahmebedingung für das Layout-Aufblasen:

Auslöser: Java.lang.NullPointerException: Versuch, die virtuelle Methode 'Android.content.Context Android.support.v4.app.FragmentHostCallback.getContext ()' für eine Nullobjektreferenz aufzurufen

Da ich diese Probleme nicht lösen konnte, habe ich auf Folgendes zurückgegriffen:

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();
  }
}

Mit folgendem Layout für die 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>

Hier gepostet, da dies hilfreich sein kann, wenn andere Personen auf die gleiche Ausnahme stoßen

0
QuantumTiger

Sie haben Recht, dass es in AppCompat v7 nicht vorhanden ist, aber Google hat tatsächlich die abstrakte Klasse AppCompatDelegate als Delegaten hinzugefügt, mit der Sie den AppCompat-Support für alle Aktivitäten verwenden können. Sie können mehr von diese Antwort finden.

Dies ist ein Beispiel dafür, wie Sie AppCompatDelegate aus den AppCompat-Beispielen von Google in Ihre Aktivität einfügen können. Sie finden es hier .

0
Ahmed Hegazy