android自定义ListPreference字体大小

这篇博客算是自己的一个记录吧,组长给了一个任务,需要实现一个紧急广播的一系列设置功能,但是客户那边设置界面的字体大小有特殊的要求,看了一下,对于ListPreference这样的控件,android系统没有提供直接的属性来设置,只好自己重写一个了.

自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="titleTextSize" format="dimension" />
    <attr name="summaryTextSize" format="dimension" />
    <declare-styleable name="CustomTitleView">
        <attr name="titleTextSize" />
        <attr name="summaryTextSize" />
    </declare-styleable>

</resources>

这里,我定义了ListPreference中title和summary的字体大小的属性,很简单,这里就不在多说了。

编写类继承自ListPreference

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.ListPreference;
import android.preference.Preference.BaseSavedState;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;

@SuppressLint("NewApi") 
public class MyListPreference extends ListPreference{

    private int mTitleTextSize;
    private int mSummaryTextSize;
    private String mValue;
    private String mSummary;
    private int mDefaultValue;

    public MyListPreference(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    @SuppressLint("NewApi") 
    public MyListPreference(Context context, AttributeSet attrs,
            int defStyleAttr) {
        this(context, attrs, defStyleAttr,0);
    }

    public MyListPreference(Context context, AttributeSet attrs,
            int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

        TypedArray arrayPreference = context.obtainStyledAttributes(attrs,
                com.android.internal.R.styleable.Preference, defStyleAttr,
                defStyleRes);
        // 获取默认的值
        mDefaultValue = arrayPreference.getInt(com.android.internal.R.styleable.Preference_defaultValue, 1);
        arrayPreference.recycle();

        TypedArray appearance = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyleAttr, 0);
        // 获取所有自定义属性的值
        for (int i = appearance.getIndexCount(); i >= 0; i--) {
            int attr = appearance.getIndex(i); 
            switch (attr) {
                case R.styleable.CustomTitleView_titleTextSize:
                    mTitleTextSize = px2dip(context,appearance.getDimensionPixelSize(attr,13));
                    break;

                case R.styleable.CustomTitleView_summaryTextSize:
                    mSummaryTextSize = px2dip(context,appearance.getDimensionPixelSize(attr,11));
                    break;
            }
        }
        appearance.recycle();

    }

    @Override
    protected void onBindView(View view) {
        final TextView titleView = (TextView) view.findViewById(com.android.internal.R.id.title);
         if (titleView != null) {
             titleView.setTextSize(mTitleTextSize);
                final CharSequence title = getTitle();
                if (!TextUtils.isEmpty(title)) {
                    titleView.setText(title);
                    titleView.setVisibility(View.VISIBLE);
                } else {
                    titleView.setVisibility(View.GONE);
                }
            }
         final TextView summaryView = (TextView) view.findViewById(
                    com.android.internal.R.id.summary);
             summaryView.setTextSize(mSummaryTextSize);
            if (summaryView != null) {
                final CharSequence summary = getSummary();
                if (!TextUtils.isEmpty(summary)) {
                    summaryView.setText(summary);
                    summaryView.setVisibility(View.VISIBLE);
                } else {
                    summaryView.setVisibility(View.GONE);
                }
            }
    }

    @Override
    public CharSequence getSummary() {
        final CharSequence entry = getEntry();
        return entry;
    }

    @Override
    public void setSummary(CharSequence summary) {
        super.setSummary(summary);
        mSummary = (String) summary;
    }

    public int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

}

上面的代码是,在构造方法里获取自定义的属性,然后在重写的onBindView方法中设置其title和summary的文字大小和颜色。

布局使用

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:custom="http://schemas.android.com/apk/res/com.test.settings"
              android:key="cell_broadcast_settings">

    .....
    <com.test.settings.MyListPreference
        android:defaultValue="2"
        android:dialogTitle="@string/alert_reminder"
        android:entries="@array/alert_sound_duration_entries"
        android:entryValues="@array/alert_sound_duration_values"
        android:key="alert_reminder_type"
        android:title="@string/alert_reminder"
        custom:titleTextSize="13sp"
        custom:summaryTextSize="11sp"
        />


</PreferenceScreen>

此时效果如下:
这里写图片描述

以上算是自己的一个记录吧,可以看到虽然实现了这样的效果,但是由于在MyListPreference中使用了系统的资源,比如”com.android.internal.R.styleable.Preference”,所以必须在源码下编译才可以,大家如果有更高的处理方法,也欢迎一起讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ListPreferenceAndroid 中的一个 UI 元素,用于在设置中显示一个可选项列表,并允许用户选择其中一个选项。默认情况下,ListPreference 显示一个预定义的选项列表,但是我们可以通过扩展它来自定义选项列表。 首先,我们需要创建一个类来扩展 ListPreference,然后覆盖 `onPrepareDialogBuilder()` 方法,在该方法中设置我们自定义的选项列表。下面是一个简单的自定义 ListPreference 的示例代码: ```java public class CustomListPreference extends ListPreference { private Context mContext; private CharSequence[] mEntries; private CharSequence[] mEntryValues; public CustomListPreference(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; } @Override protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { super.onPrepareDialogBuilder(builder); // 设置自定义的选项列表 builder.setAdapter(new CustomListAdapter(mContext, mEntries, mEntryValues), null); } public void setEntries(CharSequence[] entries) { mEntries = entries; } public void setEntryValues(CharSequence[] entryValues) { mEntryValues = entryValues; } private class CustomListAdapter extends ArrayAdapter<CharSequence> { public CustomListAdapter(Context context, CharSequence[] entries, CharSequence[] entryValues) { super(context, R.layout.custom_list_preference_item, R.id.title, entries); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); // 在这里设置选项的样式,比如字体大小、颜色等 TextView titleView = view.findViewById(R.id.title); titleView.setTextSize(18); return view; } } } ``` 在上面的代码中,我们创建了一个名为 CustomListPreference 的类来扩展 ListPreference。在 `onPrepareDialogBuilder()` 方法中,我们使用 `setAdapter()` 方法将自定义的选项列表设置为 AlertDialog 的 Adapter。在 CustomListAdapter 中,我们可以设置选项的样式,比如字体大小、颜色等。注意,在自定义列表项布局文件 custom_list_preference_item.xml 中,我们需要至少包含一个名为 title 的 TextView,以便在 CustomListAdapter 中使用。 最后,我们可以在 XML 文件中使用 CustomListPreference,如下所示: ```xml <com.example.CustomListPreference android:key="list_preference" android:title="List Preference" android:entries="@array/list_preference_entries" android:entryValues="@array/list_preference_entry_values"/> ``` 在上面的 XML 中,我们使用 CustomListPreference 替换了默认的 ListPreference,并使用 `setEntries()` 和 `setEntryValues()` 方法设置我们自定义的选项列表。注意,我们需要在 `res/values/arrays.xml` 文件中定义 `list_preference_entries` 和 `list_preference_entry_values` 数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值