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’]


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 {
public void onCreate(Bundle savedInstanceState) {


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’]


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

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

case CLOSE_ID:


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).

Note: Select outbound links may include affiliate tracking codes. Revenue generated from any potential purchases is used to fund AndroidGuys. Read our policy.



  1. 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.

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

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

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

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

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

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

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

  7. 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. :)

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

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

  10. 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!

  11. the job gets done bearing in mind…

    that internet services are available on 24 hour basis. for a business, a blog post is a necessity as it attracts clients. however, the quality of your blog plays a crucial role in determining whether you will thrive online or not….

Comments are closed.