Ich bin bei der Entwicklung meiner App plötzlich zum Stillstand gekommen, als mir klar wurde, dass PreferenceFragments in dieser Bibliothek nicht unterstützt wurden. Gibt es Alternativen, mit denen ein Rookie-Android-Entwickler dieses Hindernis überwinden kann?
Dies ist ab sofort mein Hauptfenster
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabHost
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0"/>
<FrameLayout
android:id="@+android:id/realtabcontent"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
<TabWidget
android:id="@android:id/tabs"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
/>
</TabHost>
</LinearLayout>
Für meine TabActivity verwende ich etwas, das ich online gefunden habe. Hier ist ein Ausschnitt:
public class TabControlActivity extends FragmentActivity implements TabHost.OnTabChangeListener
{
public static final int INSERT_ID = Menu.FIRST;
public static TabControlActivity thisCtx;
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap();
private TabInfo mLastTab = null;
private class TabInfo {
private String tag;
private Class clss;
private Bundle args;
private Fragment fragment;
TabInfo(String tag, Class clazz, Bundle args) {
this.tag = tag;
this.clss = clazz;
this.args = args;
}
}
class TabFactory implements TabContentFactory
{
private final Context mContext;
/**
* @param context
*/
public TabFactory(Context context) {
mContext = context;
}
/** (non-Javadoc)
* @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
*/
public View createTabContent(String tag) {
View v = new View(mContext);
v.setMinimumWidth(0);
v.setMinimumHeight(0);
return v;
}
}
...*snip*...
Gibt es eine Möglichkeit, etwas zu implementieren, das einem Präferenzfragment (oder einer Präferenzaktivität) unter Verwendung der Android-Support-v4-Kompatibilitätsbibliothek ähnelt?
android
android-fragments
CodePrimate
quelle
quelle
PreferenceFragmentCompat
wurde kürzlich zur Support-Bibliothek hinzugefügt.Antworten:
UPDATE - 6/11/2015
Die Support-v7-Bibliothek enthält jetzt
PreferenceFragmentCompat
. Es ist also eine bessere Idee, es zu verwenden.Fügen Sie Ihrer Anwendung das folgende Projekt als Bibliotheksprojekt hinzu.
https://github.com/kolavar/android-support-v4-preferencefragment
Sie können alles, einschließlich Ihrer Fragmenttransaktion, unverändert lassen. Stellen Sie beim Importieren der
PreferenceFragment
Klasse sicher, dass der Benutzer der richtige Importheader ist.anstatt
quelle
RingtonePreference
undOnSharedPreferenceChangeListener
scheint auch keine Änderungen zu bekommen!onPrepareOptionMenu
Methode zu überschreiben , zeigt mir eine seltsame Signatur (Rückgabevoid
), die sich von der Standard- Signatur unterscheidet, die wir alle kennen (Rückgabeboolean
) !!! ein ernstes Problem.Ich weiß, dass dies eine alte Frage ist, aber Sie können jetzt
PreferenceFragmentCompat
von verwendencom.android.support:preference-v7:23.3.0
quelle
PreferenceFragmentCompat
es einige wichtige Probleme gibt: Sehen Sie sich zum Beispiel diesen und diesen Fehlerbericht und viele weitere hier an . Ich habe stattdessen das veraltetePreferenceActivity
verwendet. SeufzerWichtiges Update: Die neueste Version von hat
v7 support library
jetzt einen nativen PreferenceFragmentCompat .Ich verwende diese Bibliothek , die über ein
AAR
In verfügt,mavenCentral
sodass Sie sie bei Bedarf problemlos einbinden könnenGradle
.compile 'com.github.machinarius:preferencefragment:0.1.1'
quelle
Du kannst meine eigene benutzen
PreferenceFragment
.Es ist einfach und ich hatte bisher keine Probleme damit. Ich denke, Sie können jeweils nur einen von ihnen in einer einzelnen Aktivität anzeigen, was in Ordnung sein sollte.
quelle
Support-Bibliothek für Einstellungen: Präferenzfragmente für API 7+, unabhängig von der Aktivität
Eine einfache Implementierung würde einen PreferenceFragmentCompat enthalten, wie z.
Sie müssen außerdem das PreferenceTheme in Ihrem Thema festlegen:
Und fügen Sie dies in Abhängigkeiten hinzu: http://developer.android.com/tools/support-library/features.html
quelle
Sie könnten vielleicht eine echte Aktivität und ein Fragment verwenden, aber ich denke nicht, dass es eine gute Wahl ist. Sie sollten einfache PreferenceActivity verwenden und auf Verbesserungen in Retro-kompatiblen Bibliotheken warten.
quelle
Sie können Bibliotheken von Drittanbietern wie UnifiedPreferences verwenden , um eine einzige API für alle Android-Versionen zu verwenden.
quelle
Sie können von erweitern PreferenceActivity statt und wenn Sie möchten einen ActionBar haben, können Sie es hinzufügen , eine mit Werkzeugleiste über dem Listview als für die Präferenzen verwendet.
Dies kann mithilfe eines vertikalen LinearLayout erfolgen, das die Symbolleiste und eine ListView mit android: id = "@ android: id / list" enthält .
Wenn Sie möchten, können Sie meine Lösung hier sehen .
quelle
Wie Lucius sagte, können Sie PreferenceFragmentCompat verwenden :
Sie müssen die Abhängigkeit in gradle aufnehmen:
Auf diese Weise können Sie auch FragmentTransaction von android.support.v4.app.FragmentTransaction und PrefernceFragment verwenden. Möglicherweise haben Sie jedoch Probleme mit Themen. Wenn dies der Fall ist, können Sie es unter Berücksichtigung dieses Beitrags lösen:
Lösung, mit der die Bibliothek auf API 7+ funktioniert, während das Materialthema auf API 14+ beibehalten wird
quelle