Альтернативы 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+