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?
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 :
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
.
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 :)
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.
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 ).
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 !
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.
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>
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>
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);
}
}