Все видели настройки в Android аппаратах — меню с иконками. Это стандартный PreferencesActivity, только вот стандартными функциями Андроида такого эффекта достичь невозможно.
Что бы получить такой внешний вид, используем код, позаимствованный из системного приложения Settings.apk, благо open-source это позволяет сделать.

И так, нам понадобится:
1. Класс IconPreferenceScreen.java;
2. Файл attrs.xml в папке values;
3. Лэйаут preference_icon.xml;
4. Свой класс PreferencesActivity.java;
5. Файл с настройками приложения preferences.xml
Первые 3 файла находятся в исходниках приложения настроек, но приведу их текст в топике.
Класс IconPreferenceScreen.java:
Файл attrs.xml:
Лэйаут preference_icon.xml
Далее в класс PreferencesActivity.java необходимо добавить строки, которые описывают данные пункты.
А в сам файл настроек preferences.xml сами IconPreferenceScreen

Но так как IconPreferenceScreen не является стандартным PreferenceScreen и в него нельзя добавлять другие элементы, то добавим обработку клика по нему и открытие активити.
Вот собственно и все.
В качестве бонуса можно сделать окно настроек в виде диалога, добавив в Manifest к активити настроек следующий код:
А так же можно сделать диалог без заголовка, для чего создать файл styles.xml со следующим содержанием:
и прописав в Manifest к активити

Плюсы этого подхода:
-Возможность делать красивые пункты настроек, а так же стандартные виджеты на подобии CheckBox размещать в одном окне;
-Визуальная эстетичность.
Минусы:
-Необходимость создания дополнительных активити для использования их с IconPreferenceScreen в отличии от стандартного PreferenceScreen.
Ссылки на загрузку:
1. Исходный код примера;
2. Пример приложения (apk).
В примере 3 активити, первое с использованием IconPreferenceScreen и стилем Theme.Dialog, второе (открывается по клику на любое из двух иконифицированных пунктов) стандартный PreferencesActivity с стандартными виджетами и стилем NoTitleDialog, третье с IconPreferenceScreen и стандартными виджетами без указания стиля, как раз такой вид и используется в настройках Android.
Да сделаем же красивыми окна настроек в своих приложениях, украсим мир!
Что бы получить такой внешний вид, используем код, позаимствованный из системного приложения Settings.apk, благо open-source это позволяет сделать.

И так, нам понадобится:
1. Класс IconPreferenceScreen.java;
2. Файл attrs.xml в папке values;
3. Лэйаут preference_icon.xml;
4. Свой класс PreferencesActivity.java;
5. Файл с настройками приложения preferences.xml
Первые 3 файла находятся в исходниках приложения настроек, но приведу их текст в топике.
Класс IconPreferenceScreen.java:
public class IconPreferenceScreen extends Preference { private Drawable mIcon; public IconPreferenceScreen(Context context, AttributeSet attrs) { this(context, attrs, 0); } public IconPreferenceScreen(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setLayoutResource(R.layout.preference_icon); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IconPreferenceScreen, defStyle, 0); mIcon = a.getDrawable(R.styleable.IconPreferenceScreen_icon); } @Override public void onBindView(View view) { super.onBindView(view); ImageView imageView = (ImageView) view.findViewById(R.id.icon); if (imageView != null && mIcon != null) { imageView.setImageDrawable(mIcon); } } public void setIcon(Drawable icon) { if ((icon == null && mIcon != null) || (icon != null && !icon.equals(mIcon))) { mIcon = icon; notifyChanged(); } } public Drawable getIcon() { return mIcon; } }
Файл attrs.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="IconPreferenceScreen"> <attr name="icon" format="reference" /> </declare-styleable> </resources>
Лэйаут preference_icon.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+android:id/iconpref" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" android:paddingRight="?android:attr/scrollbarSize"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6dip" android:layout_marginRight="6dip" android:layout_gravity="center" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="2dip" android:layout_marginRight="6dip" android:layout_marginTop="6dip" android:layout_marginBottom="6dip" android:layout_weight="1"> <TextView android:id="@+android:id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceLarge" android:ellipsize="marquee" android:fadingEdge="horizontal" /> <TextView android:id="@+android:id/summary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@android:id/title" android:layout_alignLeft="@android:id/title" android:textAppearance="?android:attr/textAppearanceSmall" android:maxLines="2" /> </RelativeLayout> </LinearLayout>
Далее в класс PreferencesActivity.java необходимо добавить строки, которые описывают данные пункты.
addPreferencesFromResource(R.xml.preferences); IconPreferenceScreen test = (IconPreferenceScreen) findPreference("key"); Resources res = getResources(); Drawable icon = res.getDrawable(R.drawable.icon1); test.setIcon(icono1);
А в сам файл настроек preferences.xml сами IconPreferenceScreen
<com.example.app.IconPreferenceScreen android:title="IconPreferenceScreen" android:key="key" />

Но так как IconPreferenceScreen не является стандартным PreferenceScreen и в него нельзя добавлять другие элементы, то добавим обработку клика по нему и открытие активити.
test.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { startActivity(new Intent(PreferencesActivity.this, PreferencesActivity2.class)); return true; } });
Вот собственно и все.
В качестве бонуса можно сделать окно настроек в виде диалога, добавив в Manifest к активити настроек следующий код:
android:theme="@android:style/Theme.Dialog"
А так же можно сделать диалог без заголовка, для чего создать файл styles.xml со следующим содержанием:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="NoTitleDialog" parent="android:style/Theme.Dialog"> <item name="android:windowNoTitle">true</item> </style> </resources>
и прописав в Manifest к активити
android:theme="@style/NoTitleDialog"

Плюсы этого подхода:
-Возможность делать красивые пункты настроек, а так же стандартные виджеты на подобии CheckBox размещать в одном окне;
-Визуальная эстетичность.
Минусы:
-Необходимость создания дополнительных активити для использования их с IconPreferenceScreen в отличии от стандартного PreferenceScreen.
Ссылки на загрузку:
1. Исходный код примера;
2. Пример приложения (apk).
В примере 3 активити, первое с использованием IconPreferenceScreen и стилем Theme.Dialog, второе (открывается по клику на любое из двух иконифицированных пунктов) стандартный PreferencesActivity с стандартными виджетами и стилем NoTitleDialog, третье с IconPreferenceScreen и стандартными виджетами без указания стиля, как раз такой вид и используется в настройках Android.
Да сделаем же красивыми окна настроек в своих приложениях, украсим мир!