Android:ListPreference作为字体大小选择器或访问ListView项目的各个视图

Android:ListPreference作为字体大小选择器或访问ListView项目的各个视图,android,listview,listpreference,Android,Listview,Listpreference,创建ListPreference作为“字体大小选择器”的最佳方法是什么 是否有任何方法可以访问该首选项中ListView项的各个视图并设置它们的字体大小?还是必须使用自定义适配器创建自定义ListPreference 提前感谢。已解决。我需要创建自定义的列表首选项。我找不到如何访问对话框的ListView。 标题区域保持不变,只更改了对话框的内容区域。 在onPrepareDialogBuilder(builder)中,我必须为ListView创建一个自定义适配器,在这里我可以设置不同的字体大小

创建ListPreference作为“字体大小选择器”的最佳方法是什么

是否有任何方法可以访问该首选项中ListView项的各个视图并设置它们的字体大小?还是必须使用自定义适配器创建自定义ListPreference


提前感谢。

已解决。我需要创建自定义的
列表首选项
。我找不到如何访问对话框的
ListView
。 标题区域保持不变,只更改了对话框的内容区域。 在
onPrepareDialogBuilder(builder)
中,我必须为ListView创建一个自定义适配器,在这里我可以设置不同的字体大小

public class FontSizeListPreference extends ListPreference {

    private int mClickedDialogEntryIndex;

    public FontSizeListPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FontSizeListPreference(Context context) {
        super(context);
    }

    @Override
    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
        if(getEntries() == null || getEntryValues() == null){
            super.onPrepareDialogBuilder(builder);
            return;
        }

        ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(), R.layout.preference_font_size_checked_tv, getEntries()) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                float fontSizePx;
                CheckedTextView view = (CheckedTextView) convertView;
                if(view == null){
                    view = (CheckedTextView) View.inflate(getContext(), R.layout.preference_font_size_checked_tv, null);
                }
                switch (position){
                    case 0:
                        fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_small_medium);
                        break;
                    case 2:
                        fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_large_medium);
                        break;
                    case 1:default:
                        fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_medium_medium);
                }
                view.setText(getEntries()[position]);
                view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSizePx);
                return view;
            }
        };

        mClickedDialogEntryIndex = findIndexOfValue(getValue());
        builder.setSingleChoiceItems(adapter, mClickedDialogEntryIndex, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mClickedDialogEntryIndex = which;
                FontSizeListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
                dialog.dismiss();
            }
        });
        builder.setPositiveButton(null, null);
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);

        if(positiveResult && mClickedDialogEntryIndex >= 0 && getEntryValues() != null){
            String val = getEntryValues()[mClickedDialogEntryIndex].toString();
            if(callChangeListener(val)){
                setValue(val);
            }
        }
    }
}
公共类FontSizeListReference扩展了ListPreference{
私有的国际货币指数;
公共FontSizeListReference(上下文、属性集属性){
超级(上下文,attrs);
}
公共FontSizeListReference(上下文){
超级(上下文);
}
@凌驾
受保护的无效onPrepareDialogBuilder(AlertDialog.Builder){
如果(getEntries()==null | | getEntryValues()==null){
super.onPrepareDialogBuilder(建造商);
回来
}
ArrayAdapter=新的ArrayAdapter(getContext(),R.layout.preference\u font\u size\u checked\u tv,getEntries()){
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
float-fontSizePx;
CheckedTextView视图=(CheckedTextView)convertView;
如果(视图==null){
视图=(CheckedTextView)视图。充气(getContext(),R.layout.preference\u font\u size\u checked\u tv,null);
}
开关(位置){
案例0:
fontSizePx=getContext().getResources().getDimension(R.dimen.font\u size\u small\u medium);
打破
案例2:
fontSizePx=getContext().getResources().getDimension(R.dimen.font\u size\u large\u medium);
打破
案例1:默认:
fontSizePx=getContext().getResources().getDimension(R.dimen.font\u size\u medium\u medium);
}
view.setText(getEntries()[position]);
view.setTextSize(TypedValue.COMPLEX\u UNIT\u PX,fontSizePx);
返回视图;
}
};
mClickedDialogEntryIndex=findIndexOfValue(getValue());
setSingleChoiceItems(适配器,mClickedDialogEntryIndex,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
mClickedDialogEntryIndex=其中;
FontSizeListReference.this.onClick(对话框,DialogInterface.BUTTON_阳性);
dialog.dismise();
}
});
builder.setPositiveButton(null,null);
}
@凌驾
受保护的无效onDialogClosed(布尔正结果){
super.onDialogClosed(阳性结果);
if(positiveResult&&mClickedDialogEntryIndex>=0&&getEntryValues()!=null){
字符串val=getEntryValues()[mClickedDialogEntryIndex].toString();
if(callChangeListener(val)){
设定值(val);
}
}
}
}
以及在/res/layout/preference\u font\u size\u checked\u tv.xml中定义的项目布局:


我还希望指示器位于左侧。这就是为什么选中标记被设置为null,并可拖动到适当的列表选项单个指示符。

最佳方式(不破坏任何原始的ListPreference实现):

@覆盖
受保护的无效onPrepareDialogBuilder(生成器生成器){
ArrayAdapter=新的ArrayAdapter(getContext(),R.layout.preference\u font\u size\u checked\u tv,getEntries()){
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
float-fontSizePx;
CheckedTextView视图=(CheckedTextView)convertView;
如果(视图==null){
视图=(CheckedTextView)视图。充气(getContext(),R.layout.preference\u font\u size\u checked\u tv,null);
}
开关(位置){
案例0:
fontSizePx=getContext().getResources().getDimension(R.dimen.font\u size\u small\u medium);
打破
案例2:
fontSizePx=getContext().getResources().getDimension(R.dimen.font\u size\u large\u medium);
打破
案例1:默认:
fontSizePx=getContext().getResources().getDimension(R.dimen.font\u size\u medium\u medium);
}
view.setText(getEntries()[position]);
view.setTextSize(TypedValue.COMPLEX\u UNIT\u PX,fontSizePx);
返回视图;
}
};
setAdapter(适配器,this);
super.onPrepareDialogBuilder(建造商);
}
@凌驾
公共布尔onPreferenceChange(首选项首选项,对象newValue){
setSummary(getEntry());
返回true;
}
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeightSmall"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:checkMark="@null"
    android:drawableLeft="?android:attr/listChoiceIndicatorSingle"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:height="48dp"/>
@Override
protected void onPrepareDialogBuilder(Builder builder) {            

    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(), R.layout.preference_font_size_checked_tv, getEntries()) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            float fontSizePx;
            CheckedTextView view = (CheckedTextView) convertView;
            if(view == null){
                view = (CheckedTextView) View.inflate(getContext(), R.layout.preference_font_size_checked_tv, null);
            }
            switch (position){
                case 0:
                    fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_small_medium);
                    break;
                case 2:
                    fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_large_medium);
                    break;
                case 1:default:
                    fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_medium_medium);
            }
            view.setText(getEntries()[position]);
            view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSizePx);
            return view;
        }
    };
    builder.setAdapter(adapter, this);
    super.onPrepareDialogBuilder(builder);
}

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    preference.setSummary(getEntry());
    return true;
}