Как добавить панель действий из библиотеки поддержки в PreferenceActivity?

Совместимость панели действий была добавлена ​​в библиотеку поддержки версии 18. Теперь она имеет ActionBarActivity для создания действий с панелью действий в старых версиях Android.

Есть ли способ добавить панель действий из библиотеки поддержки в PreferenceActivity?

Ранее я использовал ActionBarSherlock, и он имеет SherlockPreferenceActivity.


person Roman    schedule 25.07.2013    source источник
comment
возможно, все еще актуально: ActionBar в PreferenceActivity   -  person Matthias Robbers    schedule 25.07.2013
comment
я только что отредактировал свой ответ, нашел рабочую реализацию предпочтения, основанную на поддержке-v4, которая отлично работает с ActionBarActivity. Я использую его сам.   -  person Ostkontentitan    schedule 21.10.2013
comment
При желании вы можете использовать мое решение: github.com/AndroidDeveloperLB/MaterialStuffLibrary   -  person android developer    schedule 15.11.2014


Ответы (8)


РЕДАКТИРОВАТЬ: в appcompat-v7 22.1.0 Google добавил абстрактный класс AppCompatDelegate в качестве делегата, который вы можете использовать для расширения поддержки AppCompat для любого действия.

Используйте это так:

...
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar;
...

public class SettingsActivity extends PreferenceActivity {

    private AppCompatDelegate mDelegate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getDelegate().installViewFactory();
        getDelegate().onCreate(savedInstanceState);
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        getDelegate().onPostCreate(savedInstanceState);
    }

    public ActionBar getSupportActionBar() {
        return getDelegate().getSupportActionBar();
    }

    public void setSupportActionBar(@Nullable Toolbar toolbar) {
        getDelegate().setSupportActionBar(toolbar);
    }

    @Override
    public MenuInflater getMenuInflater() {
        return getDelegate().getMenuInflater();
    }

    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        getDelegate().setContentView(layoutResID);
    }

    @Override
    public void setContentView(View view) {
        getDelegate().setContentView(view);
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        getDelegate().setContentView(view, params);
    }

    @Override
    public void addContentView(View view, ViewGroup.LayoutParams params) {
        getDelegate().addContentView(view, params);
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        getDelegate().onPostResume();
    }

    @Override
    protected void onTitleChanged(CharSequence title, int color) {
        super.onTitleChanged(title, color);
        getDelegate().setTitle(title);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getDelegate().onConfigurationChanged(newConfig);
    }

    @Override
    protected void onStop() {
        super.onStop();
        getDelegate().onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getDelegate().onDestroy();
    }

    public void invalidateOptionsMenu() {
        getDelegate().invalidateOptionsMenu();
    }

    private AppCompatDelegate getDelegate() {
        if (mDelegate == null) {
            mDelegate = AppCompatDelegate.create(this, null);
        }
        return mDelegate;
    }
}

Больше никаких взломов. Код взят из AppCompatPreferenceActivity.java.

person Ľubomír Kučera    schedule 02.11.2014
comment
пожалуйста, поместите свои основные фрагменты кода в свой ответ. чтобы избежать потенциальной проблемы с неработающей ссылкой. - person Yohanes Khosiawan 许先汉; 03.11.2014
comment
спасибо, это работает для меня - я бы изменил новый LinearLayout в первом вызове раздувания на: (ViewGroup) getWindow().getDecorView().getRootView() - person ahmedre; 05.11.2014
comment
У меня тоже работает и помогло мне восстановить название настроек, которое было потеряно при обновлении до версии 21. - person 3c71; 05.11.2014
comment
Это работает для меня, чтобы вернуть ActionBar в активность предпочтений после обновления до версии 21. Я использую mActionBar.setLogo(R.drawable.icon);, чтобы показать значок моего приложения вместо имени приложения. - person hfann; 27.11.2014
comment
Это не работает с вложенными элементами ‹PreferenceScreen›. Вложенные экраны настроек не имеют панели инструментов. - person petrsyn; 29.11.2014
comment
@petrsyn Это действительно работает. Посмотрите здесь и здесь, чтобы узнать, как это сделать. - person Ľubomír Kučera; 29.11.2014
comment
@Любомир Кучера Спасибо за ответ. Ваше решение создает вложенный PreferenceScreen вручную в методе onCreate() дочернего класса PreferenceActivity. Мой комментарий был об использовании ‹PreferenceScreen›, вложенного в другой ‹PreferenceScreen› в файле prefs.xml. Это перестало работать в AppCompat v21. Раньше это работало в старых версиях библиотеки AppCompat, а также в библиотеке ActionBarSherlock. В любом случае, спасибо за ответ. - person petrsyn; 01.12.2014
comment
Если я использую ‹style name=Theme.Application parent=@style/Theme.AppCompat.Light.DarkActionBar /›, текст моих настроек будет черным на темно-сером фоне. Каков самый простой способ исправить это? - person swooby; 08.02.2015
comment
@swooby Вы можете столкнуться с этой ошибкой. - person Ľubomír Kučera; 09.02.2015
comment
@petrsyn Я решил проблему вложенности здесь stackoverflow.com/a/27455363/566127 - person David Passmore; 10.06.2015
comment
Любая идея, почему переключатель ListPreferences перестает работать после применения этого подхода? (андроид 4.0.3). - person southerton; 14.10.2015
comment
Когда я закомментировал //getDelegate().installViewFactory(); ListPreference начал работать. Странное поведение. - person southerton; 14.10.2015
comment
@ĽubomírKučera Это дает мне почти полностью вид 2.x. Хорошо, флажки в материальном стиле, но все остальное старое. В чем тогда смысл этого? - person f470071; 04.11.2015
comment
@petrsyn: у меня такая же проблема, как и у тебя. Как я могу это исправить? Пробовал по способу Любомира Кучерабута, но не получилось. - person Phan Sinh; 30.08.2016
comment
Итак, где мне разместить панель инструментов в xml? Я получаю исключение NullPointerException - person Martin Erlic; 21.11.2016

В настоящее время нет способа добиться этого с помощью AppCompat. Я открыл внутреннюю ошибку.

person Chris Banes    schedule 26.07.2013
comment
Спасибо @Крис. Было бы неплохо иметь эту функцию. - person Pablo; 26.07.2013
comment
@Maarten, ссылка не работает с текущей библиотекой поддержки, вероятно, потребуется гораздо больше работы, чтобы создать свою собственную. - person imbryk; 29.08.2013
comment
@ Крис, у тебя есть идеи, когда мы можем ожидать, что PreferenceActivity будет добавлено к ActionBarCompat? - person imbryk; 29.08.2013
comment
@nsL Я до сих пор помню, что это была проблема, и как ABS аккуратно ее решила. Но я бы не стал надеяться, так как некоторые важные вопросы тогда были отклонены. Разочарование. - person davidcesarino; 17.10.2013
comment
Я думаю, что очень маловероятно, что эта функция будет реализована. Количество устройств под управлением более старых версий Android (‹ 4.0) на данный момент составляет менее 30%, и это число уменьшается с каждым месяцем. - person Roman; 07.11.2013
comment
@ Крис, можешь указать идентификатор ошибки, чтобы я мог следить за прогрессом в этой области? - person Martin Rajniak; 06.12.2013
comment
Это было введено почти год назад и нет разрешения?? - person Someone Somewhere; 06.04.2014
comment
w.t.f все еще ждет?? - person Broak; 01.06.2014
comment
Вероятно, в то время это было невозможно, но теперь я заставил его работать без каких-либо «обходных путей». См. мой ответ stackoverflow.com/a/25603448/1276636 - person Sufian; 10.09.2014
comment
Этот ответ устарел, сегодня есть решение, см. ответ @Ľubomír Kučera - person Gavriel; 04.11.2014
comment
Один из тысячи багов ;-) - person powder366; 26.02.2016

Мне удалось создать обходной путь, аналогичный тому, что использует Google Play Store. Ссылка на исходный ответ

Найдите репозиторий GitHub: здесь


Очень похоже на ваш собственный код, но добавлен xml для установки заголовка:

Продолжаем использовать PreferenceActivity:

settings_toolbar.xml :

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    app:navigationContentDescription="@string/abc_action_bar_up_description"
    android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:title="@string/action_settings"
    />

SettingsActivity.java :

public class SettingsActivity extends PreferenceActivity {

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
        Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
        root.addView(bar, 0); // insert at top
        bar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

}

Result :

пример


ОБНОВЛЕНИЕ (совместимость с имбирными пряниками):

Как указано здесь , устройства Gingerbread возвращают NullPointerException в этой строке:

LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();

ИСПРАВИТЬ:

SettingsActivity.java :

public class SettingsActivity extends PreferenceActivity {

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        Toolbar bar;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            LinearLayout root = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent();
            bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
            root.addView(bar, 0); // insert at top
        } else {
            ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
            ListView content = (ListView) root.getChildAt(0);

            root.removeAllViews();

            bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
            

            int height;
            TypedValue tv = new TypedValue();
            if (getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {
                height = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
            }else{
                height = bar.getHeight();
            }

            content.setPadding(0, height, 0, 0);

            root.addView(content);
            root.addView(bar);
        }

        bar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

Любые проблемы с вышеуказанным дайте мне знать!


ОБНОВЛЕНИЕ 2: ВРЕМЕННОЕ РЕШЕНИЕ ДЛЯ ТОНИРОВАНИЯ

Как указано во многих заметках разработчиков, PreferenceActivity не поддерживает окрашивание элементов, однако, используя несколько внутренних классов, вы МОЖЕТЕ добиться этого. То есть до тех пор, пока эти классы не будут удалены. (Работает с помощью appCompat support-v7 v21.0.3).

Добавьте следующий импорт:

import android.support.v7.internal.widget.TintCheckBox;
import android.support.v7.internal.widget.TintCheckedTextView;
import android.support.v7.internal.widget.TintEditText;
import android.support.v7.internal.widget.TintRadioButton;
import android.support.v7.internal.widget.TintSpinner;

Затем переопределите метод onCreateView:

@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
    // Allow super to try and create a view first
    final View result = super.onCreateView(name, context, attrs);
    if (result != null) {
        return result;
    }

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        // If we're running pre-L, we need to 'inject' our tint aware Views in place of the
        // standard framework versions
        switch (name) {
            case "EditText":
                return new TintEditText(this, attrs);
            case "Spinner":
                return new TintSpinner(this, attrs);
            case "CheckBox":
                return new TintCheckBox(this, attrs);
            case "RadioButton":
                return new TintRadioButton(this, attrs);
            case "CheckedTextView":
                return new TintCheckedTextView(this, attrs);
        }
    }

    return null;
}

Result:

пример 2


Совместимость приложений 22.1

В AppCompat 22.1 представлены новые окрашенные элементы, а это означает, что больше нет необходимости использовать внутренние классы для достижения того же эффекта, что и в последнем обновлении. Вместо этого следуйте этому (все еще переопределяя onCreateView):

@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
    // Allow super to try and create a view first
    final View result = super.onCreateView(name, context, attrs);
    if (result != null) {
        return result;
    }

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        // If we're running pre-L, we need to 'inject' our tint aware Views in place of the
        // standard framework versions
        switch (name) {
            case "EditText":
                return new AppCompatEditText(this, attrs);
            case "Spinner":
                return new AppCompatSpinner(this, attrs);
            case "CheckBox":
                return new AppCompatCheckBox(this, attrs);
            case "RadioButton":
                return new AppCompatRadioButton(this, attrs);
            case "CheckedTextView":
                return new AppCompatCheckedTextView(this, attrs);
        }
    }

    return null;
}

ВЛОЖЕННЫЕ ЭКРАНЫ НАСТРОЙКИ

У многих людей возникают проблемы с включением панели инструментов во вложенные <PreferenceScreen />, однако я нашел решение!! - После долгих проб и ошибок!

Добавьте следующее к вашему SettingsActivity:

@SuppressWarnings("deprecation")
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    super.onPreferenceTreeClick(preferenceScreen, preference);

    // If the user has clicked on a preference screen, set up the screen
    if (preference instanceof PreferenceScreen) {
        setUpNestedScreen((PreferenceScreen) preference);
    }

    return false;
}

public void setUpNestedScreen(PreferenceScreen preferenceScreen) {
    final Dialog dialog = preferenceScreen.getDialog();

    Toolbar bar;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        LinearLayout root = (LinearLayout) dialog.findViewById(android.R.id.list).getParent();
        bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
        root.addView(bar, 0); // insert at top
    } else {
        ViewGroup root = (ViewGroup) dialog.findViewById(android.R.id.content);
        ListView content = (ListView) root.getChildAt(0);

        root.removeAllViews();

        bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);

        int height;
        TypedValue tv = new TypedValue();
        if (getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {
            height = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
        }else{
            height = bar.getHeight();
        }

        content.setPadding(0, height, 0, 0);

        root.addView(content);
        root.addView(bar);
    }

    bar.setTitle(preferenceScreen.getTitle());

    bar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });
}

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


Панель инструментов Тень

По дизайну импорт Toolbar не допускает повышения и затенения на устройствах до v21, поэтому, если вы хотите иметь возвышение на своем Toolbar, вам нужно обернуть его в AppBarLayout:

`settings_toolbar.xml:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

   <android.support.v7.widget.Toolbar
       .../>

</android.support.design.widget.AppBarLayout>

Не забыв добавить добавить библиотеку поддержки дизайна в качестве зависимости в файл build.gradle:

compile 'com.android.support:support-v4:22.2.0'
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:design:22.2.0'

Андроид 6.0

Я изучил обнаруженную проблему перекрытия и не могу ее воспроизвести.

Полный код, используемый, как указано выше, производит следующее:

введите здесь описание изображения

Если я что-то упустил, сообщите мне через этот репозиторий, и я проверю.

person David Passmore    schedule 13.12.2014
comment
Здорово! Работает как шарм :) - person Tobi; 21.05.2015
comment
Почему это не работает для вложенного PreferenceScreen, а только для основного PreferenceScreen? - person Tobi; 22.05.2015
comment
@Tobi Я обновил свой ответ, чтобы решить вложенную проблему, и объяснил, почему. :) - person David Passmore; 10.06.2015
comment
Спасибо! Ваш совет AppCompat 22.1 помог мне :) Очень полезно! - person Martin Pfeffer; 23.06.2015
comment
@DavidPassmore, почему я не вижу тень на API 10, когда я оборачиваю панель инструментов в appbarlayout? - person Jemshit Iskenderov; 12.07.2015
comment
@DavidPassmore, зачем заворачивать его в AppBarLayout для тени, если он работает v21+? почему бы просто не использовать высоту? - person Jemshit Iskenderov; 12.07.2015
comment
почему PreferenceActivity такая заноза в заднице ??? это должно экономить время. С тем же успехом я мог бы сделать обычную активность и вручную выложить все настройки в линейном макете. Фууууу! - person Someone Somewhere; 03.09.2015
comment
В Android API 24, в ВКЛАДЫВАЕМЫХ ЭКРАНАХ ПРЕДПОЧТЕНИЙ, в этой строке ( LinearLayout root = (LinearLayout) dialog.findViewById(android.R.id.list).getParent(); ) я получаю эту ошибку: java.lang.ClassCastException : android.widget.FrameLayout нельзя преобразовать в android.widget.LinearLayout. Есть ли решение для этого??? - person S.P.; 28.06.2016
comment
Привет @D.O. можете ли вы поднять это на GitHub, чтобы я мог отслеживать ошибки :) - person David Passmore; 28.06.2016
comment
Привет @David, ты имеешь в виду эту ссылку на github, не так ли? github.com/davcpas1234/MaterialSettings - person S.P.; 28.06.2016
comment
Сделанный! поднять в GitHub - person S.P.; 28.06.2016

Найдена реализация PreferenceFragment на основе фрагмента support-v4:

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

Изменить: я только что протестировал его, и он отлично работает!

person Ostkontentitan    schedule 18.10.2013
comment
@Константин, можешь добавить пример кода? Я скачал его, изменил импорт с android.preference.PreferenceFragment на android.support.v4.preference.PreferenceFragment, и я вижу, что он добавил некоторые заголовки в середине экрана, но не панель действий вверху. - person Gavriel; 03.08.2014
comment
Он не добавляет панель действий, которая является работой действия. К сожалению, у меня нет образца кода, но он должен работать примерно так: developer.android. com/reference/android/preference/ - person Ostkontentitan; 04.08.2014

Интеграция PreferenceActivity с ABC невозможна, по крайней мере, для меня. Я попробовал две возможности, которые смог найти, но ни одна из них не сработала:

Опция 1:

ActionBarPreferenceActivity расширяет PreferenceActivity. Когда вы делаете это, вы получаете ограничение ActionBarActivityDelegate.createDelegate(ActionBarActivity activity). Также вам нужно реализовать ActionBar.Callbacks, который недоступен

Вариант 2:

ActionBarPreferenceActivity расширяет ActionBarActivity. Этот подход требует перезаписи совершенно новых PreferenceActivity, PreferenceManager и может быть PreferenceFragment, что означает, что вам нужен доступ к скрытым классам, таким как com.android.internal.util.XmlUtils. Решение этой проблемы может прийти только от разработчиков Google, реализующих ActionBarWrapper, которые можно добавить к любой деятельности.

Если вам действительно нужно действие предпочтения, мой совет на данный момент: ActionBarSherlock.

Однако мне удалось реализовать это здесь.

person Maxwell Weru    schedule 04.01.2014
comment
Per4.0 приносит сбой. Я разветвил его и улучшил. gist.github.com/0e9fe2119b901921b160 - person TeeTracker; 27.07.2014
comment
Проверьте мое решение. Он не использует никакого обходного пути stackoverflow.com/a/25603448/1276636 - person Sufian; 10.09.2014
comment
Это ничего не решает! Надеюсь, вы понимаете суть проблемы - person Maxwell Weru; 09.11.2014

Предыстория проблемы:

ОП хочет знать, как мы можем поместить MenuItems в ActionBar из PreferenceActivity для pre-Honeycomb, потому что в библиотеке поддержки Android есть ошибка, которая не позволяет этому произойти.

Мое решение:

Я нашел гораздо более чистый способ, чем уже предложенный, для достижения цели (и нашел его в Документы Android):

android:parentActivityName

Имя класса логического родителя действия. Имя здесь должно соответствовать имени класса, указанному в атрибуте android:name соответствующего элемента.

Система считывает этот атрибут, чтобы определить, какое действие следует запустить, когда пользователь нажимает кнопку «Вверх» на панели действий. Система также может использовать эту информацию для синтеза резервного стека действий с помощью TaskStackBuilder.

Для поддержки уровней API 4–16 вы также можете объявить родительскую активность с помощью элемента, указывающего значение для «android.support.PARENT_ACTIVITY». Например:

<activity
    android:name="com.example.app.ChildActivity"
    android:label="@string/title_child_activity"
    android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support API level 4+ -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app.MainActivity" />
</activity>

Теперь сделайте то, что вы обычно делаете в своем onOptionsItemSelected(). Поскольку это часть Android Docs, у него нет побочных эффектов.

Удачного кодирования. :)

Обновлять:

Это решение больше не работает, если вы ориентируетесь на Lollipop. Если вы используете AppCompat, вам следует искать этот ответ.

person Sufian    schedule 01.09.2014
comment
Как это помогает получить панель действий в Preference Activity? - person Frozen Crayon; 01.11.2014
comment
@АрджунУ. простое решение - попробуй и разберись. - person Sufian; 02.11.2014
comment
@АрджунУ. Проблема заключалась в том, что у PreferencesActivity не было никакого способа поместить элементы в ActionBar, особенно кнопку «Назад». Мой ответ - хорошее решение для этого. - person Sufian; 02.11.2014
comment
Спасибо за минус. Любое объяснение, как я мог улучшить свой ответ или что было не так? - person Sufian; 14.11.2014
comment
@АрджунУ. Я обновил свой ответ. Пожалуйста, удалите свой отрицательный голос. - person Sufian; 17.11.2014
comment
@Sufian Спасибо за ссылку на мой ответ, рад, что он всем помогает :) - person David Passmore; 28.04.2015

Я смог получить android.app.Actionbar с помощью getActionBar(). Сначала он вернул нулевое значение... затем я перешел к манифесту и изменил тему на:

android:theme="@style/Theme.AppCompat"

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

Меня это устроит, потому что приложение, над которым я работаю, предназначено для ICS/4.0+.

person RCB    schedule 03.04.2014
comment
Вот более простое решение, в котором не используются обходные пути stackoverflow.com/a/25603448/1276636 - person Sufian; 10.09.2014

Теперь официальный ответ на эту проблему был выпущен. Это библиотека v7/v14 Preference Support.

См. Как использовать библиотеку поддержки предпочтений v7/v14? для обсуждения того, как его использовать.

person Randy Sugianto 'Yuku'    schedule 01.09.2015