Альтернативы PreferenceFragment с android-support-v4 - PullRequest
90 голосов
/ 20 марта 2012

Я внезапно остановился в разработке моего приложения, когда понял, что PreferenceFragments не поддерживаются в этой библиотеке.Есть ли какие-либо альтернативы, которые может использовать разработчик-новичок для Android, чтобы преодолеть это препятствие?

Это мое основное окно на данный момент

<?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*...

Можно ли реализовать что-то, что напоминает фрагмент предпочтения (или preferenceActivity), с помощью библиотеки совместимости android-support-v4?

Ответы [ 9 ]

128 голосов
/ 01 сентября 2015

Я знаю, что это старый вопрос, но теперь вы можете использовать PreferenceFragmentCompat из com.android.support:preference-v7:23.3.0

85 голосов
/ 22 декабря 2013

ОБНОВЛЕНИЕ - 6/11/2015

Библиотека Support-v7 теперь включает PreferenceFragmentCompat.Поэтому будет лучше использовать его.


Добавьте следующий проект в качестве проекта библиотеки в ваше приложение.

https://github.com/kolavar/android-support-v4-preferencefragment

Вы можете сохранитьвсе, включая ваш фрагмент транзакции, как есть.При импорте класса PreferenceFragment убедитесь, что правильный заголовок импорта - пользователь.

import android.support.v4.preference.PreferenceFragment;

вместо

import android.preference.PreferenceFragment;
16 голосов
/ 17 марта 2014

Важное обновление: Последняя версия из v7 support library теперь имеет собственный PreferenceFragmentCompat .

Я использую эту библиотеку , которая имеет AAR в mavenCentral, так что вы можете легко включить ее, если используете Gradle.

compile 'com.github.machinarius:preferencefragment:0.1.1'

10 голосов
/ 07 августа 2014

Вы можете использовать мой собственный PreferenceFragment.

Это просто, и у меня до сих пор не было проблем с этим.Я думаю, что вы можете отображать только один из них одновременно в одном действии, что должно быть в порядке.

9 голосов
/ 27 февраля 2016

Библиотека поддержки предпочтений: Фрагменты предпочтений для 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
7 голосов
/ 20 марта 2012

Вы можете использовать реальную деятельность и использовать фрагмент, но я не думаю, что это хороший выбор. Вы должны использовать простую PreferenceActivity и ждать улучшений в ретро-компатибах.

2 голосов
/ 14 ноября 2013

Вы можете использовать сторонние библиотеки, такие как UnifiedPreferences , чтобы использовать единый API для всех версий Android.

0 голосов
/ 17 февраля 2016

Как сказал Люциус, вы можете использовать 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 +

0 голосов
/ 28 ноября 2014

Вы можете расширить с PreferenceActivity вместо этого, и если вы хотите иметь ActionBar, вы можете добавить его, используя Панель инструментов как и над ListView, используемым для предпочтений.

Это можно сделать с помощью вертикального LinearLayout, который содержит панель инструментов и ListView с android: id = "@ android: id / list" .

Если хотите, можете посмотреть мое решение здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...