1、在ManiFest配置文件里给Acitivity加上自定义的样式。如:android:theme="@style/MyStyle"
且看MyStyle.xml配置文件
本例只用到了CheckBox和ListView,如果设置界面用到其它控件,如radioButton之类的,同样的方式,加上editTetStyle,radioButtonStyle即可。<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomWindowTitleBackground"> <item name="android:background">@drawable/skinpic_green</item> </style> <style name="CustomWindowTitleText" > <item name="android:textSize">20dip</item> <item name="android:textColor">#FFffffff</item> <item name="android:paddingLeft">10dp</item> </style> <style name="customCheckBox" parent="@android:style/Widget.CompoundButton.CheckBox"> <item name="android:button">@drawable/selector_checkbox</item> </style> <style name="customListView" parent="@android:style/Widget.ListView"> <item name="android:scrollbarSize">10.0dip</item> <item name="android:scrollbarThumbVertical">@drawable/scrollbar_handle_vertical</item> <item name="android:listSelector">@drawable/selector_list</item> <item name="android:cacheColorHint">#00000000</item> </style> <style name="Default.NoTitleBar" parent="@android:style/Theme.Light.NoTitleBar"> <item name="android:textColorPrimaryInverse">@android:color/black</item> <item name="android:windowBackground">@color/window_bg</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowTitleSize">42.0dip</item> <item name="android:windowTitleStyle">@style/CustomWindowTitleText</item> <item name="android:windowTitleBackgroundStyle">@style/CustomWindowTitleBackground</item> <item name="android:checkboxStyle">@style/customCheckBox</item> <item name="android:listViewStyle">@style/customListView</item> </style> <style name="Default" parent="@style/Default.NoTitleBar"> <item name="android:windowNoTitle">false</item> </style> </resources>
2、自定义Preference布局,则需派生一个Preference子类。并配置相关XML布局文件。
上一个方法很显然有局限性,只是针对整个设置Activity统一的style。
我以类ListPreference自定义的实现举例:
下面是自定义的xml布局文件
3、利用android:widgetLayout属性下面是自定义的preference的java文件<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+android:id/widget_frame" android:layout_width="fill_parent" android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" android:paddingRight="?android:attr/scrollbarSize"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="18dip" 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> <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" /> </LinearLayout>
如果你想更改ImageView里面的图标,就是以实用setIcon()方法。因为自己完成功能比较简单,所以重写的方法就比较少,可以根据自己的需求来添加更多的方法。import com.android.mms.R; import android.content.Context; import android.graphics.drawable.Drawable; import android.preference.Preference; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; public class IconListPreference extends Preference{ private Drawable mIcon; public IconListPreference(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs); this.setLayoutResource(R.layout.icon_list_preference); //这里设置的是icon初始化的图标 this.mIcon = context.getResources().getDrawable(R.drawable.ycz20_black); } public IconListPreference(final Context context, final AttributeSet attrs) { this(context, attrs, 0); } @Override protected void onBindView(final View view) { super.onBindView(view); final ImageView imageView = (ImageView)view.findViewById(R.id.icon); if ((imageView != null) && (this.mIcon != null)) { imageView.setImageDrawable(this.mIcon); } } /** * Sets the icon for this Preference with a Drawable. * * @param icon The icon for this Preference */ public void setIcon(final Drawable icon) { if (((icon == null) && (this.mIcon != null)) || ((icon != null) && (!icon.equals(this.mIcon)))) { this.mIcon = icon; this.notifyChanged(); } } public void setIcon(int iconRes) { if(R.drawable.ycz20_black!=iconRes){ this.mIcon = getContext().getResources().getDrawable(iconRes); this.notifyChanged(); } } /** * Returns the icon of this Preference. * * @return The icon. * @see #setIcon(Drawable) */ public Drawable getIcon() { return this.mIcon; } }
下面就是自定义CheckBoxPreference的的CheckBox按钮。
1./res/xml/my_preference.xml
2./res/layout/my_checkbox.xml<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <CheckBoxPreference android:key="cbp" android:summaryOff="Off" android:summaryOn="On" android:title="CheckBoxPreference" android:widgetLayout="@layout/my_checkbox" /> </PreferenceScreen>
3./res/drawable/checkbox_checked_style.xml<?xml version="1.0" encoding="utf-8"?> <CheckBox xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+android:id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:button="@drawable/checkbox_checked_style" android:clickable="false" android:focusable="false" />
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/icon_checkbox_unchecked" android:state_checked="false"/> <item android:drawable="@drawable/icon_checkbox_checked" android:state_checked="true"/> </selector>
4.MainActivity.java注意要继承PreferenceActivity
public class MainActivity extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.my_preference); } }
![]()
![]()
左边是系统默认的CheckBox,右边是自定义后的CheckBox样式。