Альтернативи PreferenceFragment з android-support-v4


90

Я раптово зупинився у розробці свого додатка, коли зрозумів, що 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*...

Чи є щось для реалізації чогось, що нагадує фрагмент преференції (або preferenceActivity) за допомогою бібліотеки сумісності android-support-v4?



Насправді не дублікат, оскільки я перебуваю в ситуації, коли мені "потрібно", щоб ці уподобання відображалися в тахості. Подивіться мою
редакцію

Дивіться мою оновлену відповідь . 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, здається, не отримую жодних змін!
madlymad

2
Я думав, що корисно користуватися цією бібліотекою. Але я зрозумів, що це не так добре, як я думав. Спроба замінити onPrepareOptionMenuметод показує мені дивний підпис (повертається void), відмінний від типового, який ми всі знаємо (повертається boolean) !!! серйозне питання.
S.Thiongane

9
проголосували, і ви маєте право на безкоштовну вечерю щоразу, коли приїжджаєте до Мадрида ... ця проблема зводила мене з розуму!
руппс

7
@mansoulx onPrepareOptionsMenu завжди має тип повернення void для фрагментів (на відміну від Activity, для якого він є логічним), тому цей підпис цілком належним чином.
Кумбая,

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 .

Я використовую цю бібліотеку , яка має AARв mavenCentralтак що ви можете легко включити його , якщо ви використовуєте Gradle.

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


Не могли б ви поділитися, як ви імпортуєте та розширюєте фрагмент підтримки? Дякую
Стівен

1
@ Steve Звичайно! Я зробив Суть .
theblang

@mattblang Велике спасибі!
Стівен

@mattblang Велике спасибі ... Ваша допомога справді економить мій багато часу
Asad Ullah Rafiq

Виняток java.lang.RuntimeException: Вміст має подання з атрибутом id „android.R.id.list“, який не є класом ListView
Абдул Рахман,

10

Ви можете використовувати мою власну PreferenceFragment.

Це просто, і дотепер у мене з цим не було проблем. Я думаю, що ви можете відображати лише один з них за раз в одній діяльності, що повинно бути нормально.


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

7

Ви можете використовувати справжню діяльність і використовувати фрагмент, але я не думаю, що це вдалий вибір. Вам слід скористатися простою функцією PreferenceActivity і почекати вдосконалення ретро compat libs.


1
Я не можу використовувати PreferenceActivity, оскільки решта мого додатка складається з віджета табуляції. Фрагмент преференції повинен відображатися над віджетом вкладки. Я мав зробити це діяльністю, натомість вона зайняла б весь екран.
CodePrimate

2
Потім скористайтеся спеціальним фрагментом списку
zapl


0

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

Це можна зробити за допомогою вертикального LinearLayout, який містить Панель інструментів і ListView з android: id = "@ android: id / list" .

Якщо ви хочете, ви можете побачити моє рішення тут .


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. Однак у вас можуть бути проблеми з темами. Якщо це так, ви можете вирішити це, беручи до уваги цей пост:

Рішення, як змусити lib працювати на API 7+, зберігаючи тему матеріалу на API 14+

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.