Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Android PreferenceScreen with icon image.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="IconPreference">
<attr name="icon" format="reference" />
</declare-styleable>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_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="6dp"
android:layout_marginRight="6dp"
android:layout_gravity="center" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="6dp"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
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"
android:textColor="?android:attr/textColorSecondary" />
</RelativeLayout>
<LinearLayout android:id="@+android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:orientation="vertical" />
</LinearLayout>
package org.sazabi.lib.preference;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.preference.Preference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
/**
* 左側にアイコンを表示するPreference.
*
* @author sora (shinpei.okamura@insprout.com)
*/
public class IconPreference extends Preference {
private Drawable icon = null;
/**
* iconプロパティからリソースを読み込む.
*
* {@inheritDoc}
* @see Preference#IconPreference(Context,AttributeSet,int)
*/
public IconPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setLayoutResource(R.layout.icon_preference);
TypedArray ta = context.obtainStyledAttributes(
attrs, R.styleable.IconPreference, defStyle, 0);
icon = ta.getDrawable(R.styleable.IconPreference_icon);
}
/**
* {@inheritDoc}
* @see Preference#IconPreference(Context,AttributeSet)
*/
public IconPreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
/**
* アイコンのImageViewを設定する.
*
* {@inheritDoc}
* @see Preference#onBindView(View)
*/
protected void onBindView(View view) {
super.onBindView(view);
ImageView imageView = (ImageView) view.findViewById(R.id.icon);
if (imageView != null) {
if (icon != null) {
imageView.setImageDrawable(icon);
} else {
imageView.setVisibility(View.GONE);
}
}
}
/**
* アイコンを設定.
*
* @param icon
*/
public void setIcon(Drawable icon) {
if (this.icon == null && icon != null
|| icon != null && !icon.equals(this.icon)) {
this.icon = icon;
notifyChanged();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:sazabi="http://schemas.android.com/apk/res/org.sazabi.lib.preference">
<org.sazabi.lib.preference.IconPreference
android:key="help"
android:title="@string/pref_help"
sazabi:icon="@drawable/icon" />
</PreferenceScreen>
@philippb
Copy link

philippb commented Jul 29, 2014

not sure what API level this code is, but PreferenceScreen is now a final class :(
public final class PreferenceScreen

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment