So fügen Sie eine Kopf-und Präferenz-Objekt PreferenceActivity nicht mit einer XML-Datei, aber Java?
Habe ich PreferenceFragment und eine PreferenceActivity, von dem ich hinzufügen-Header aus einer XML-Datei auf diese Weise:
PreferenceActivity
@Override
public void onBuildHeaders(List<Header> target) {
if(DEBUG) Log.i("PreferenceActivity", "onBuildHeaders() -> LogicAnalizerPrefs");
if(android.os.Build.VERSION.SDK_INT >= 12) {
loadHeadersFromResource(R.xml.preference_header_logicanalizer, target);
}
}
PreferenceFragment:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(DEBUG) Log.i("PreferenceFragment", "onCreate() -> LogicAnalizerPrefsFragment");
int res = getActivity().getResources().getIdentifier(getArguments().getString("logicprefsheaders"), "xml", getActivity().getPackageName());
addPreferencesFromResource(res);
}
Sowie die XML-Datei, wo ich den Header ist:
R. xml.preference_header_logicanalizer:
<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="General" >
<extra
android:name="logicprefsheaders"
android:value="logicgeneral" />
</header>
<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="Canal 1" >
<extra
android:name="logicprefsheaders"
android:value="c1analizerprefs" />
</header>
<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="Canal 2" >
<extra
android:name="logicprefsheaders"
android:value="c2analizerprefs" />
</header>
<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="Canal 3" >
<extra
android:name="logicprefsheaders"
android:value="c3analizerprefs" />
</header>
<header
android:fragment="com.protocolanalyzer.andres.LogicAnalizerPrefsFragment"
android:icon="@drawable/settings"
android:title="Canal 4" >
<extra
android:name="logicprefsheaders"
android:value="c4analizerprefs" />
</header>
- Und dies ist einer meiner xml-Dateien, die verwendet werden, um anzuzeigen, die Einstellungen beim klicken auf einen Header:
c1analizerprefs.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="@string/AnalyzerProtocolTitle1" >
<ListPreference
android:defaultValue="0"
android:entries="@array/protocolList"
android:entryValues="@array/protocolValues"
android:key="protocol1"
android:summary="@string/AnalyzerProtocolSummary"
android:title="@string/AnalyzerProtocolTitle1" />
<ListPreference
android:defaultValue="1"
android:entries="@array/channelNames"
android:entryValues="@array/protocolValues"
android:key="SCL1"
android:summary="@string/AnalyzerSCLSummary"
android:title="@string/AnalyzerSCLTitle" />
<EditTextPreference
android:defaultValue="9600"
android:title="@string/AnalyzerBaudTitle"
android:key="BaudRate1"
android:summary="@string/AnalyzerBaudSummary"
android:inputType="number" />
</PreferenceCategory>
</PreferenceScreen>
So, in einer großen screen-ich habe diese Ergebnis wie erwartet und ich nur ein PreferenceFragment, um meinen 4-Header.
Aber meine vier Voreinstellungen definiert in der XML wie c1analizerprefs.xml sind fast die gleichen die einzige änderung ist eine Zahl (Zum Beispiel: Pref. 1, Pref. 2, ...), so möchte ich hinzufügen, dass Sie in Java so kann ich mit einer for() zum hinzufügen von 4 oder mehr Einstellungen einfach ändern Sie die Anzahl der Wiederholungen, denn der text ist immer der gleiche ich habe nur eine Nummer ändern, so dass auf diese Weise ich don ' T brauchen zu erstellen eine XML-Datei für jede Vorliebe, ich erstellen Sie dynamisch in Java.
Wie kann ich eine Präferenz für einen Header in Java anstelle der Verwendung einer XML-Datei? In PreferenceFragment ich habe nur addPreferencesFromResource() oder addPreferencesFromIntent(). Eine Möglichkeit, fügen Sie eine Präferenz für ein Objekt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen von Header dynamisch wird nicht einfach sein. Als android-Dokumentation besagt:
Wenn Sie immer noch wollen, um zu gehen mit einer dynamischen Lösung, möchten Sie vielleicht einen Blick auf den Quellcode von loadHeadersFromResource (zum Beispiel hier http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/preference/PreferenceActivity.java#PreferenceActivity.loadHeadersFromResource(int%2Cjava.util.List) )
Zusammenfassend
müssen Sie erstellen eine PreferenceActivity.Header-Objekt,
bereiten es für die Nutzung durch einstellen der verschiedenen Eigenschaften finden Sie in der Dokumentation: http://developer.android.com/reference/android/preference/PreferenceActivity.Header.html,
und schließlich hinzufügen, dass die erstellten header auf der Liste:
target.add(header);
(Ziel ist das argument, dass die an onBuildHeaders)Nur für den Fall jemand ist eigentlich auf der Suche nach etwas code...
Im folgenden Beispiel werden einige dieser Header die von XML und fügt Ihnen programmatisch.
1. überschreiben onBuildHeaders in Ihrem PreferenceActivity:
Dann überschreiben onHeaderClick in Ihrem PreferenceActivity. Beachten Sie, dass die header-fragmentArguments, um das fragment, so können Sie erkennen, welche Kopfzeile geklickt wurde (Kategorie):
Dann in Ihrem PreferenceFragment überschreiben onCreate:
In Fall, dass Sie möchten, um die xml für die vordefinierten Headern.
res/xml/preference_headers.xml
res/xml/preferences_map.xml
Hoffentlich habe ich nicht falsch verstanden, deine Frage:
Super Antwort von @goodies4uall
Ich möchte bloß hinzufügen (da ich noch nicht Bearbeiten, Beiträge), die Sie brauchen nicht etwas Phantasie in onHeaderClick().
Wenn Sie möchten, fügen Sie eine Kopfzeile außerhalb des onBuildHeaders() der beste Weg, es zu tun ist, ungültig zu machen und Ihnen zu ermöglichen, onBuildHeaders (), um die neue hinzufügen, wenn Sie das nächste Feuer (invalidateHeaders verursachen onBuildHeaders, um das Feuer wieder), etwa so:
Werden und dann die onBuildHeaders: