在preference中加入自定义,无法使用findViewById,编译会报错,估计很多同学跟我一样遇到过这个问题。
由于最近刚开发了一个客户需求,也遇到这样的问题,现在已经解决,我搜了下网上好像没有类似的文档,我就自己写个,希望对大家有所帮助。
1、首先自定义个继承preference的类Testpreference,然后在布局中调用:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/storage_settings_title" >
<PreferenceCategory
android:key="phone_ram_category"
android:title="@string/storage_settings_title" >
<com.android.settings.deviceinfo.Testpreference
android:key="text_key"
android:fragment="com.android.settings.deviceinfo.Memory"/>
</PreferenceCategory>
</PreferenceScreen>
2、Testpreference类的部分代码如下:
public class CpMemoryPreference extends Preference {
…… ……
public CpMemoryPreference(Context context, AttributeSet attrs) {
super(context, attrs); // 注:必须是2个参数的,否则会报错
mContext = context;
}
// 重点来了,复写onCreateView方法,就可以对自定义布局做各种操作啦
@Override
protected View onCreateView(ViewGroup parent) {
// TODO Auto-generated method stub
LayoutInflater inflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.test_linear_layout, null); // 加载自定义布局.test_linear_layout
mMaxTitle = (TextView)layout.findViewById(R.id.max_title); // 现在就findViewById 了
return layout;
}
…… ……
}
3、如何调用布局中的com.android.settings.deviceinfo.Memory呢,
在调用自定义布局的类中(一般是)
先找到key
mTest = (Testpreference)findPreference("text_key");
然后在 onPreferenceTreeClick方法中加入如下代码:
if(mTest == preference){
super.onPreferenceTreeClick(preferenceScreen, mTest);
return true; // 一定要return true,否则按键不起作用
}
当然如果要想按键做其他功能,在if(mTest == preference)判断中加入你想调用的功能即可。
OK,搞定!