Android菜鸟的成长笔记——PreferenceFragment 与 自定义Preference

本文记录了一位Android新手在创建Settings界面时的体验,从使用被弃用的PreferenceActivity转向使用PreferenceFragment。通过在Fragment的onCreate方法中添加代码,实现了设置界面。然而,当尝试使用EditTextPreference时,发现只能显示标题而无法显示内容。为解决这个问题,作者创建了一个继承自EditTextPreference的自定义类,并研究了EditTextPreference的源码,了解到样式设置的必要性。

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

今天要做一个Setting界面,想到了可以用PreferenceActivity做。

public void addPreferencesFromResource (int preferencesResId),This method was deprecated in API level 11.

那就换成用PreferenceFragment做吧。

首先,实现一个Fragment extends PreferenceFragment,比用layout还简单,在onCreate加上如下代码就能用了:

addPreferencesFromResource(R.xml.preference_setting);

然后,在activity静态加入Fragment:

FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        SettingFragment prefFragment = new SettingFragment();
        transaction.add(R.id.settingContent, prefFragment);
        transaction.commit();

实现的第一个功能是:修改用户名,有个EditTextPreference,先试一下,发现只能显示title,不显示内容。那就自定义一个吧。

首先写个类继承EditTextPreference。

public class MyEditPreference extends EditTextPreference
{
    private Context mContext;
    private TextView  mTitle;
    private TextView mContent;
    public MyEditPreference(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        mContext = context;
    }

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

    public MyEditPreference(Context context)
    {
        this(context, null);
    }

    @Override
    protected View onCreateView(ViewGroup parent)
    {
        super.onCreateView(parent);
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_setting_edit,parent,false);
        mTitle = (TextView) view.findViewById(R.id.tvTitle);
        mContent = (TextView) view.findViewById(R.id.tvContent);
        mTitle.setText(getTitle());
        mContent.setText(getText());
        return view;
    }
}
试了一下,前面显示标题,后面显示内容,点了之后,发现对话框不对啊,只有标题,没有编辑框。

看了一下EditTextPreference的代码,发现原来是有样式的。加上:

public MyEditPreference(Context context, AttributeSet attrs)
    {
        this(context, attrs, android.R.attr.editTextPreferenceStyle);
    }
对话框弹出来了,可是修改之后,不更新,发现EditTextPrefer 有个onDialogClosed的方法,重写一下:

 @Override
    protected void onDialogClosed(boolean positiveResult)
    {
        super.onDialogClosed(positiveResult);
        if(positiveResult)
        {
            mContent.setText(getText());
        }
    }
ok,搞定了
preference_setting.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.baqu.toupiao.preference.MyEditPreference
        android:key="name"
        android:title="用户名"/>
</PreferenceScreen>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值