Альтернативы PreferenceFragment с поддержкой android-v4
Я внезапно прекратил разработку своего приложения, так как понял, что PreferenceFragments не поддерживаются в этой библиотеке. Существуют ли альтернативы, которые разработчик новичков-андроидов может использовать для преодоления этого препятствия?
Это мое главное окно на данный момент
<?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>
Для моей TabActivity я использую то, что я нашел в Интернете. Вот фрагмент:
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*...
Есть ли какие-либо возможности для реализации чего-то, что напоминает preferencefragment (или preferenceActivity), используя библиотеку совместимости android-support-v4?
Ответы
Ответ 1
ОБНОВЛЕНИЕ - 6/11/2015
Библиотека поддержки-v7 теперь включает PreferenceFragmentCompat
. Поэтому лучше использовать его.
Добавьте следующий проект в качестве проекта библиотеки в ваше приложение.
https://github.com/kolavar/android-support-v4-preferencefragment
Вы можете хранить все, включая транзакцию фрагмента, как есть. При импорте класса PreferenceFragment
убедитесь, что правильный заголовок импорта является пользователем.
import android.support.v4.preference.PreferenceFragment;
вместо
import android.preference.PreferenceFragment;
Ответ 2
Я знаю, что это старый вопрос, но теперь вы можете использовать PreferenceFragmentCompat
от com.android.support:preference-v7:23.3.0
Ответ 3
Важное обновление: последняя версия v7 support library
теперь имеет собственный PreferenceFragmentCompat.
Я использую эту библиотеку, которая имеет AAR
в mavenCentral
, поэтому вы можете легко включить ее, если используете Gradle
.
compile 'com.github.machinarius:preferencefragment:0.1.1'
Ответ 4
Вы можете использовать собственный PreferenceFragment
.
Это просто, и до сих пор у меня не было никаких проблем. Я думаю, что вы можете отображать только один из них за один раз в одном действии, который должен быть в порядке.
Ответ 5
Библиотека поддержки предпочтений: Фрагменты предпочтений для API 7+, независимо от деятельности
Простая реализация будет включать PreferenceFragmentCompat, например:
public class PreferencesFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.preferences);
}
}
Вам также нужно установить preferenceTheme в вашей теме:
<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
И добавьте это в зависимости:
http://developer.android.com/tools/support-library/features.html
com.android.support:preference-v14:23.1.0
Ответ 6
Вы можете использовать реальную деятельность и использовать фрагмент, но я не думаю, что это хороший выбор. Вы должны использовать простую функцию PreferenceActivity и дождаться улучшения в файлах retro compat.
Ответ 7
Вы можете использовать сторонние библиотеки, такие как UnifiedPreferences, чтобы использовать один API для всех версий Android.
Ответ 8
Вместо этого вы можете перейти от PreferenceActivity, и если вы хотите иметь ActionBar, вы можете добавить его, используя a Панель инструментов как над списком ListView, используемым для настроек.
Это можно сделать, используя вертикальный LinearLayout, который содержит панель инструментов и ListView с android: id = "@android: id/list" .
Если вы хотите, вы можете увидеть мое решение здесь.
Ответ 9
Как сказал Люциус, вы можете использовать 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);
}
}
Вы должны указать его зависимость в gradle:
dependencies {
...
compile 'com.android.support:preference-v7:23.1.X' (wherX = 0,1,...)
...
}
Таким образом вы также можете использовать FragmentTransaction android.support.v4.app.FragmentTransaction и PrefernceFragment.
Однако у вас могут быть проблемы с темами. Если это так, вы можете решить это с учетом этого сообщения:
Решение, чтобы заставить lib работать с API 7+ при сохранении материальной темы в API 14+