Nagle zatrzymałem się w rozwoju mojej aplikacji, gdy zdałem sobie sprawę, że PreferenceFragments nie są obsługiwane w tej bibliotece. Czy są jakieś alternatywy, z których początkujący programista Android może skorzystać, aby pokonać tę przeszkodę?
To jest teraz moje główne okno
<?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>
Do mojego TabActivity używam czegoś, co znalazłem online. Oto fragment:
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*...
Czy jest coś do zaimplementowania czegoś, co przypomina preferencefragment (lub preferenceActivity) przy użyciu biblioteki zgodności android-support-v4?
android
android-fragments
CodePrimate
źródło
źródło
PreferenceFragmentCompat
został niedawno dodany do biblioteki wsparcia.Odpowiedzi:
AKTUALIZACJA - 11.06.2015
Biblioteka Support-v7 zawiera teraz
PreferenceFragmentCompat
. Więc lepiej będzie z niego skorzystać.Dodaj następujący projekt jako projekt biblioteki do swojej aplikacji.
https://github.com/kolavar/android-support-v4-preferencefragment
Możesz zachować wszystko, w tym transakcję fragmentową, tak jak jest. Podczas importowania
PreferenceFragment
klasy upewnij się, że prawidłowy nagłówek importu to user.import android.support.v4.preference.PreferenceFragment;
zamiast
import android.preference.PreferenceFragment;
źródło
RingtonePreference
a takżeOnSharedPreferenceChangeListener
nie wydaje się, żebym wprowadzał żadnych zmian!onPrepareOptionMenu
metody pokazuje mi dziwny podpis (zwracavoid
) inny niż domyślny, który wszyscy znamy (zwracaboolean
) !!! poważny problem.Wiem, że to stare pytanie, ale możesz teraz użyć
PreferenceFragmentCompat
zcom.android.support:preference-v7:23.3.0
źródło
PreferenceFragmentCompat
ma kilka poważnych problemów: zobacz na przykład ten i ten raport o błędzie, a także wiele innych tutaj . Skończyło się na tym, żePreferenceActivity
zamiast tego użyłem wycofanego . westchnienieWażna aktualizacja: najnowsza wersja z
v7 support library
obecnie posiada natywną PreferenceFragmentCompat .Używam tej biblioteki , która ma
AAR
in,mavenCentral
więc możesz ją łatwo dołączyć, jeśli używaszGradle
.compile 'com.github.machinarius:preferencefragment:0.1.1'
źródło
Możesz użyć mojego własnego
PreferenceFragment
.To proste i do tej pory nie miałem z tym żadnych problemów. Myślę, że możesz wyświetlić tylko jeden z nich naraz w jednym działaniu, co powinno być OK.
źródło
Biblioteka obsługi preferencji: fragmenty preferencji dla API 7+, bez względu na aktywność
Prosta implementacja obejmowałaby PreferenceFragmentCompat, na przykład:
public class PreferencesFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences); } }
Musisz także ustawić preferenceTheme w swoim motywie:
<style name="AppTheme" parent="@style/Theme.AppCompat.Light"> <item name="preferenceTheme">@style/PreferenceThemeOverlay</item> </style>
I dodaj to w zależnościach: http://developer.android.com/tools/support-library/features.html
com.android.support:preference-v14:23.1.0
źródło
Możesz użyć prawdziwej aktywności i fragmentu, ale nie sądzę, że to dobry wybór. Powinieneś użyć prostego PreferenceActivity i poczekać na ulepszenia w bibliotekach kompatybilnych z retro.
źródło
Możesz użyć bibliotek innych firm, takich jak UnifiedPreferences, aby użyć jednego interfejsu API dla wszystkich wersji Androida.
źródło
Zamiast tego możesz rozszerzyć z PreferenceActivity , a jeśli chcesz mieć ActionBar, możesz dodać go za pomocą paska narzędzi jako znajdującego się powyżej ListView używanego dla preferencji.
Można to zrobić za pomocą pionowego LinearLayout, który zawiera pasek narzędzi i ListView z android: id = "@ android: id / list" .
Jeśli chcesz, możesz zobaczyć moje rozwiązanie tutaj .
źródło
Jak powiedział Lucjusz, możesz użyć PreferenceFragmentCompat :
public class MyPreferenceFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle bundle, String s) { PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false); addPreferencesFromResource(R.xml.preferences); } }
Musisz uwzględnić jego zależność w gradle:
dependencies { ... compile 'com.android.support:preference-v7:23.1.X' (wherX = 0,1,...) ... }
W ten sposób możesz również użyć FragmentTransaction z android.support.v4.app.FragmentTransaction i PrefernceFragment. Jednak możesz mieć problemy z motywami. Jeśli tak, możesz go rozwiązać, biorąc pod uwagę ten post:
Rozwiązanie sprawiające, że biblioteka działa na API 7+, zachowując motyw materiału na API 14+
źródło