Альтернативы PreferenceFragment с поддержкой android-v4

90

Я внезапно остановил разработку своего приложения, когда понял, что 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?

CodePrimate
источник
На самом деле это не дубликат, как я в ситуации, когда мне «нужно», чтобы эти предпочтения отображались внутри tabhost. Смотрите мою правку
CodePrimate
Смотрите мой обновленный ответ . PreferenceFragmentCompatбыл недавно добавлен в библиотеку поддержки.
theblang

Ответы:

86

ОБНОВЛЕНИЕ - 11.06.2015

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


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

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

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

import android.support.v4.preference.PreferenceFragment;

вместо того

import android.preference.PreferenceFragment;
Субин Себастьян
источник
4
Этот код github, похоже, имеет серьезные проблемы ... Я не могу использовать RingtonePreferenceи OnSharedPreferenceChangeListener, похоже, не получил никаких изменений!
Mando Stam
2
Я подумал, что использовать эту библиотеку - хорошая идея. Но я понял, что это не так хорошо, как я думал. Попытка переопределить onPrepareOptionMenuметод показывает мне странную подпись (возвращается void), отличную от стандартной, которую мы все знаем (возвращается boolean) !!! серьезная проблема.
S.Tiongane
9
проголосовали за, и вы имеете право на бесплатный ужин всякий раз, когда приедете в Мадрид ... эта проблема сводила меня с ума!
rupps
7
@mansoulx onPrepareOptionsMenu всегда имеет тип возврата void для фрагментов (в отличие от Activity, для которого он является логическим), поэтому эта подпись полностью соответствует ожиданиям.
Cumbayah
3
О проблемах с библиотекой, вероятно, следует сообщать в проекте github.
Mathijs Segers
128

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

Люциус
источник
4
Отличная находка, сейчас это один из правильных ответов.
Mythul
У меня работает только с com.android.support:preference-v7:23.0.1.
Фелипе Моссо
1
Кажется, что этого не происходит на серверах зависимостей при попытке добавить его из Android Studio. Нужно ли мне добавлять для него репозиторий?
Брилл Паппин
Он не содержит этого класса
JJ Ab
1
Я случайно проголосовал за этот ответ и сейчас не могу его отменить, поэтому просто отмечу, что PreferenceFragmentCompat него есть некоторые серьезные проблемы: см. Этот и этот отчет об ошибке, например, и многие другие здесь . PreferenceActivityВместо этого я использовал устаревшее . вздох
Вики Чижвани
16

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

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

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

пустышка
источник
Не могли бы вы рассказать, как вы импортируете и расширяете фрагмент поддержки? Спасибо
Стивен
1
@ Стив Конечно! Я сделал Гист .
theblang
@mattblang Большое спасибо!
Стивен
@mattblang Большое спасибо ... Ваша помощь действительно сэкономила мне много времени
Асад Уллах Рафик,
Исключение java.lang.RuntimeException: контент имеет представление с атрибутом id 'android.R.id.list', который не является классом ListView
Абдул Рахман,
10

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

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

BladeCoder
источник
9

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

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

Snicolas
источник
1
Я не могу использовать PreferenceActivity, поскольку остальная часть моего приложения состоит из виджета-вкладки. Фрагмент предпочтений должен отображаться над виджетом вкладки. Я должен был сделать это занятием вместо того, чтобы оно занимало весь экран.
CodePrimate
2
Затем используйте какой-нибудь фрагмент настраиваемого списка
zapl
2

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

MarcoDuff
источник
0

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

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

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

разработчик Android
источник
0

Как сказал Люциус, вы можете использовать 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. Однако у вас могут быть проблемы с темами. Если это так, вы можете решить эту проблему с учетом этого сообщения:

Решение, чтобы библиотека работала на API 7+, сохраняя тему материалов на API 14+

Vicasdia
источник