December 18, 2014

What's Your Preference: Part One

Beginning with the 0.9 SDK, Android has introduced a framework for presenting a consistent set of preference-setting options for users, so different applications do not have to “reinvent the wheel”. Today, we will take a look at the basics of setting up such a preferences UI, in an except from The Busy Coder’s Guide to Android Development.

The linchpin to the preferences framework is yet another XML data structure. You can describe your application’s preferences in an XML file stored in your project’s res/xml/ directory. Given that, Android can present a pleasant user UI for manipulating those preferences, which are then stored in the SharedPreferences you get back from getDefaultSharedPreferences().

Below, you will find the preference XML for a trivial set of preferences:

[sourcecode language=’xml’]

xmlns:android="http://schemas.android.com/apk/res/android">
android:key="@string/checkbox"
android:title="Checkbox Preference"
android:summary="Check it on, check it off" />
android:key="@string/ringtone"
android:title="Ringtone Preference"
android:showDefault="true"
android:showSilent="true"
android:summary="Ping a tone, any tone" /> [/sourcecode]

The root of the preference XML is a PreferenceScreen element. We will explain why it is named that in a future post; for now, take it on faith that it is a sensible name.

One of the things you can have inside a PreferenceScreen element, not surprisingly, are preference definitions. These are subclasses of Preference, such as CheckBoxPreference or RingtonePreference, as shown above. As one might expect, these allow you to check a checkbox or choose a ringtone, respectively.

Given that you have set up the preference XML, you can use a nearly-built-in activity for allowing your users to set their preferences. The activity is “nearly-built-in” because you need to subclass it to point it to your preference XML, plus hook it into the rest of your application.

So, for example, here is an activity that displays the UI for the preferences shown above:

[sourcecode language=’java’]
package com.commonsware.android.prefs;

import android.app.Activity;
import android.os.Bundle;
import android.preference.PreferenceActivity;

public class EditPreferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);
}
}
[/sourcecode]

As you can see, there is not much to see. All you need to do is call addPreferencesFromResource() and specify the XML resource containing your preferences.

You will also need to add this as an activity to your AndroidManifest.xml file:

[sourcecode language=’xml’]
apk/res/android"
package="com.commonsware.android.prefs">

android:name=".SimplePrefsDemo"
android:label="@string/app_name">





android:name=".EditPreferences"
android:label="@string/app_name">



[/sourcecode]

And you will need to arrange to invoke the activity, such as from a menu option:

[sourcecode language=’java’]
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case EDIT_ID:
startActivity(new Intent(this, EditPreferences.class));
return(true);

case CLOSE_ID:
finish();
return(true);
}

return(super.onOptionsItemSelected(item));
}
[/sourcecode]

However, that is all that is needed, and it really is not that much code outside of the preferences XML. When you get for your effort is an Android-supplied preference UI:

The Preferences activity

The Preferences activity

The checkbox can be directly checked or unchecked. To change the ringtone preference, just click on the entry in the preference list to bring up a selection dialog:

The RingtonePreference selection dialog

The RingtonePreference selection dialog

In our next episode, we will look at adding some structure to the preferences UI, by creating groups of preferences (categories) and additional pages of preferences (screens).



  • Mafian

    I checked all three of these tutorials. They are pretty good, except you missed one very important aspect. How does one access these persistent preferences in code? Declaring, selecting, and persisting preferences is only 3/4 of the battle. Using the preferences is also important, and that aspect is completely overlooked in all three of your android preferences tutorials.

  • http://208.peugeotimi.ru Baby

    It’s so interetsing for me! Thanx!

  • http://bezchp.ru/ WatHoinaron

    5 февраля компанией «Полисет-СБ» будет представлена комплексная система безопасности под названием «Экспресс». Данная демонстрация пройдет в Москве в Выставочном комплексе «Крокус Сити», ведь именно здесь в это время и будет проводиться выставка «Технологии безопасности», тематике которой «Экспресс» полностью соответствует.

  • http://marzia.ru/ waymnlync

    Теперь я скажу несколько слов о подводке к дичи молодой собаки и о ее стойке.(В работе собаки по дичи следует различать 4 момента (подразделения) ее работы:

    1 — поиск, длящийся до того момента, как собака начнет причуивать признаки присутствия дичи в доступном для ее чутья расстоянии;

    2 — потяжку — работа собаки, разбирающейся в донесшемся до нее запахе до момента окончательного определения ею наличия дичи; эта работа заканчивается

  • Advinnauttend

    Работаю менеджером. Хочу сделать интернет магазин. Порекомендуйте человека или организацию, кто поможет мне в этом. Главное чтоб человек, который его делает был адекватный и недорого.

  • http://ranenianosa.ru мишкa

    Ну конечно, жизнь не может быть идеальной :)

  • http://auto-drin.ru/ Измаил

    интересная статья, грамотно оформлена, а вы перечитываете когда пишите?)

  • http://4satelit.ru/ bazaran

    автору респект, сколько времени потратил на такую статью

  • http://konechnosti.ru Владислав

    Спасибо за информацию, буду юзать. :)

  • http://intensedebate.com/people/benvd benvd

    I spent days trying to figure out why it didn't work, even when I copied everything literally from this page. Finally I found the reason: in your preferences.xml file, the xml tags should start with a capital letter, i.e. PreferenceScreen, CheckboxPreference and RingtonePreference.

    Apart from that, nice tutorial. It just drove me a little nuts. :)

  • http://snowysport.ru/category/begovye-lyzhi/ Snowy

    Всем примвет. Недавно отметил вторую годовщину ведения своего блога. Хотелось бы узнать у автора, да и у комментирующих: а насколько долго Вы ведёте свой ресурс?
    Честно говоря, у меня были сложные моменты, когда посещали мысли бросить это дело. Сначала из-за вылета из Яндекса, позже – из-за отсутствия времени. Но спустя какое то время начинаешь понимать, что иногда полезно выложить на лист (в данном случае на веб страницу :) свои мысли, поделиться чем-то интересным со своими читателями. Автору сего ресурса хотелось бы пожелать, чтоб вдохновение на новые посты никогда не покидало! Удачи…

  • http://l4dmaps.ru left4dead

    на с++ смахивает

  • http://zzz.artemushek.com artemushek

    Что то в верхнем углу высплыло, и Каспер показал что сайт заражон вирусом,
    аффтар, да у тебя iframe вирус …

  • Guy

    holy crap, i was about to go insane because it didnt work for me aswell, I then read the post by benvd and yes the preferences.xml should be using capital and stuff. Thx for that post! you just saved me prolly a lot of hear, hours of my life and what more.

    Thx for the tutorial! It is very clear!

  • Pingback: туроператор по израилю

  • Pingback: туроператор по израилю

  • Pingback: http://www.youtube.com/watch?v=YDgC1l8Egj4

  • Pingback: iPage review

  • Pingback: http://answers.yahoo.com/question/index?qid=20130116233009AAMXIoz

  • Pingback: bespangle arterioversion anesthetizer