自定义PreferenceActivity方法汇总

本文总结了自定义PreferenceActivity的方法,包括在Manifest中设置自定义样式,以及创建自定义Preference布局。通过派生Preference子类和配置XML布局文件,可以实现个性化设置。示例中展示了如何自定义CheckBoxPreference,提供了自定义XML布局文件和MainActivity的实现细节,展示自定义样式的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在ManiFest配置文件里给Acitivity加上自定义的样式。如:android:theme="@style/MyStyle"

且看MyStyle.xml配置文件

<?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>
本例只用到了CheckBox和ListView,如果设置界面用到其它控件,如radioButton之类的,同样的方式,加上editTetStyle,radioButtonStyle即可。

2、自定义Preference布局,则需派生一个Preference子类。并配置相关XML布局文件。

上一个方法很显然有局限性,只是针对整个设置Activity统一的style。

我以类ListPreference自定义的实现举例:

下面是自定义的xml布局文件

<?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> 
下面是自定义的preference的java文件

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;
    }
}
如果你想更改ImageView里面的图标,就是以实用setIcon()方法。因为自己完成功能比较简单,所以重写的方法就比较少,可以根据自己的需求来添加更多的方法。

3、利用android:widgetLayout属性

下面就是自定义CheckBoxPreference的的CheckBox按钮。

1./res/xml/my_preference.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>
2./res/layout/my_checkbox.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" />
3./res/drawable/checkbox_checked_style.xml
<?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样式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值