今天要做一个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>