wake-up-neo.com

Wie erstelle ich Präferenzaktivität und Präferenzfragment auf Android?

Als ich einem alten Tutorial folgte ( Créez des applications pour Android -> openclassroom ), blieb ich bei dieser veralteten Methode addPreferencesFromResource(int id) aus der PreferenceActivity stecken Klasse.

Meine Frage lautet also:

Was ist die neue Methode zum Erstellen von Einstellungen in Android?

40
WannaGetHigh

Ich habe diesen Beitrag gefunden ( Was anstelle von "addPreferencesFromResource" in einer PreferenceActivity zu verwenden? ), um zu verstehen, dass Sie ein PreferenceFragment durchlaufen müssen, um dies zu tun.

In der folgenden Erklärung verwende ich your.package., Um zu zeigen, dass Sie den Paketnamen eingeben müssen. Jeder hat sein eigenes Paket, also ersetzen Sie es bitte durch Ihr Paket.

lass uns anfangen :


1. Präferenzfragment

  • Erstellen Sie Ihre PreferenceFragment-Klasse

    MyPreferenceFragment

    public class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.fragment_preference);
        }
    }
    


  • Dann die zugehörige XML-Ressource

    fragment_preference.xml (im Ordner res/xml Ihres Projekts)

    <?xml version="1.0" encoding="utf-8"?>
    
    <PreferenceScreen
        xmlns:Android="http://schemas.Android.com/apk/res/Android">
    
        <PreferenceCategory 
            Android:title="FOO">
    
            <CheckBoxPreference
                Android:key="checkBoxPref"
                Android:title="check it out"
                Android:summary="click this little box"/>
    
        </PreferenceCategory>
    
    </PreferenceScreen>
    

    Das ist alles für den Teil Fragment.



2. Bevorzugte Aktivität

  • Erstellen Sie die PreferenceActivity-Klasse

    MyPreferenceActivity

    public class MyPreferenceActivity extends PreferenceActivity
    {
        @Override
        public void onBuildHeaders(List<Header> target)
        {
            loadHeadersFromResource(R.xml.headers_preference, target);
        }
    
        @Override
        protected boolean isValidFragment(String fragmentName)
        {
            return MyPreferenceFragment.class.getName().equals(fragmentName);
        }
    }
    

    Vergessen Sie nicht , die isValidFragment(String fragmentName) -Methode zu überschreiben, da Sie von Ihrer Anwendung ins Gesicht geschlagen werden! ;) Im Ernst, ich habe keine Ahnung, warum Sie dies tun müssen, aber es ist erforderlich. Wenn jemand eine Erklärung dazu hat, würde ich sie gerne lesen :)

    EDIT:


    Dank kirtan403 weiß ich jetzt, warum es benötigt wird: es muss wegen einer ( Android Framework Fragment Injection ) gesetzt werden.


    Wie Sie in der onBuildHeaders(List<Header> target) sehen können, laden wir eine weitere XML-Datei, die die Header der Voreinstellung enthält. Kurz gesagt, Überschriften sind der linke Teil der Präferenz und das Fragment ist der rechte Teil (für Tablets). Bei einem Telefon haben Sie zuerst die Überschriften, und wenn Sie auf einen Eintrag klicken, wird das entsprechende Fragment ganz oben in der Überschriftenliste angezeigt.

    Lesen Sie diesen Artikel ( Multi-Panel-Entwicklung in Android mit Fragmenten - Tutorial ) die Bilder erklären sich.


  • Dann die zugehörige XML-Ressource

    headers_preference.xml (im Ordner res/xml Ihres Projekts)

    <?xml version="1.0" encoding="utf-8"?>
    
    <preference-headers
        xmlns:Android="http://schemas.Android.com/apk/res/Android">
    
        <header 
            Android:fragment="your.package.MyPreferenceFragment"
            Android:title="Goto: Preference fragment"
            Android:summary="An example of some preferences." />
    
    </preference-headers>
    

    Wie Sie vielleicht im Abschnitt header bemerkt haben, haben Sie:

    Android:fragment="your.package.MyPreferenceFragment"

    Dies fungiert als Link zu dem Fragment, das Sie anzeigen möchten. Auf dem Tablet wird es im rechten Teil geladen und auf dem Telefon wird es über der aktuellen Ansicht geladen.



3. Android Manifest

Nun müssen Sie Ihre Aktivität zur Datei AndroidManifest.xml Hinzufügen.

Fügen Sie im Abschnitt application die folgenden Zeilen hinzu:

<activity
    Android:name="your.package.MyPreferenceActivity"
    Android:label="Preferences">
</activity>

Sie werden mir wahrscheinlich sagen:

"Oh Liebling, du hast vergessen, Android: launchMode =" singleTask " in deine Aktivitäten zu integrieren."

Aber SETZEN SIE DIESES NICHT EIN, da Sie Ihr Fragment niemals auf das Telefon laden werden. Dieser Fehler wurde von einem tollen Mann behoben! Dies ist der Link zu seinem Blog ( Einstellungen für Android-Header auf kleinem Bildschirm/Handy ).



4. Starten Sie die Einstellungen aus dem Menü

Schließlich müssen Sie die Fähigkeit hinzufügen, diese Präferenz zu zeigen !! Dazu benötigen Sie drei Dinge:

  • Das Menü

    menu.xml (im Ordner res/menu Ihres Projekts)

    <?xml version="1.0" encoding="utf-8"?>
    
    <menu 
        xmlns:Android="http://schemas.Android.com/apk/res/Android">
    
        <item 
            Android:id="@+id/preferences"
            Android:title="Preferences" />
    
    </menu>
    


  • Laden dieses Menüs in Ihre Hauptaktivität (nicht die PreferenceActivity) unter der Methode onCreateOptionsMenu(Menu menu)

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }
    


  • Starten der Aktivität MyPreferenceActivity, wenn Sie auf diese Schaltfläche klicken.

    Dazu müssen Sie die onOptionsItemSelected(MenuItem item) -Methode in Ihrer Hauptaktivität überschreiben.

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch(item.getItemId())
        {
            case R.id.preferences:
            {
                Intent intent = new Intent();
                intent.setClassName(this, "your.package.MyPreferenceActivity");
                startActivity(intent);
                return true;
            }
        }
    
        return super.onOptionsItemSelected(item);
    }
    



Et voila les amis!

Ich habe diesen Code nicht getestet. Ich nahm es und änderte es von meinem eigenen Code, also habe ich möglicherweise die eingefügten Sachen nicht gut kopiert. Wenn Sie auf Fehler stoßen, versuchen wir, das Problem herauszufinden und es zu beheben.

Ich hoffe, dieser Beitrag hilft einigen Leuten da draußen: D

Prost !

101
WannaGetHigh

Ich mochte die Lösung aus diesem Beitrag: http://alvinalexander.com/Android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment

.. weil es für jemanden am kompaktesten zu sein scheint, der nur etwas sehr Grundlegendes braucht, das schnell funktioniert. Es gibt nur eine .Java-Datei und zwei kleine XML-Dateien.

Activity Config REMINDERS

Vergessen Sie nach dem Hinzufügen der 3 Dateien zu Ihrem Projekt nicht

A) Fügen Sie die Prefs-Aktivität zur Manifest-Datei hinzu
B) Fügen Sie eine Möglichkeit zum Starten der Voreinstellungsaktivität hinzu, z. B. eine Schaltfläche oder einen Menüeintrag

Fügen Sie Ihrem Projekt die folgenden Dateien hinzu. Verwenden Sie die Reihenfolge, in der sie aufgeführt sind, um Kompilierungsfehler zu vermeiden.

  1. Fügen Sie /res/values/array.xml hinzu

    <resources>
        <string-array name="listArray">
            <item>Ace</item>
            <item>Club</item>
        </string-array>
    
        <string-array name="listValues">
            <item>Ace</item>
            <item>Club</item>
        </string-array>
    </resources>
    
  2. Fügen Sie /res/xml/preferences.xml hinzu

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <EditTextPreference Android:title="Your Name"
                            Android:key="username"
                            Android:summary="Please provide your username"></EditTextPreference>
        <CheckBoxPreference Android:title="Application Updates"
                            Android:defaultValue="false"
                            Android:summary="This option if selected will allow the application to check for latest versions."
                            Android:key="applicationUpdates" />
        <ListPreference     Android:title="Download Details"
                            Android:summary="Select the kind of data that you would like to download"
                            Android:key="downloadType"
                            Android:defaultValue="Ace"
                            Android:entries="@array/listArray"
                            Android:entryValues="@array/listValues" />
    </PreferenceScreen>
    
  3. Fügen Sie den Aktivitätscode hinzu

    public class AppPreferenceActivity extends PreferenceActivity
    {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            getFragmentManager().beginTransaction().replace(Android.R.id.content, new MyPreferenceFragment()).commit();
    
            checkValues();
        }
    
        public static class MyPreferenceFragment extends PreferenceFragment
        {
            @Override
            public void onCreate(final Bundle savedInstanceState)
            {
                super.onCreate(savedInstanceState);
                addPreferencesFromResource(R.xml.preferences);
            }
        }
    
        private void checkValues()
        {
            SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
            String strUserName = sharedPrefs.getString("username", "NA");
            boolean bAppUpdates = sharedPrefs.getBoolean("applicationUpdates",false);
            String downloadType = sharedPrefs.getString("downloadType","1");
    
            String msg = "Cur Values: ";
            msg += "\n userName = " + strUserName;
            msg += "\n bAppUpdates = " + bAppUpdates;
            msg += "\n downloadType = " + downloadType;
    
            Toaster.shortDebug(msg);
        }
    }
    
19
Gene Bo