上文中提到custom preference 的实现,基本没什么问题,但在项目开发中,当点击preferenceitem的时候,当前的item的高度总会自动扩充,这样造成的后果开始不觉得什么,但当功能实现得已经趋紧完美的时候,就会-降低用户的体验效果,招致反感。
首先:想到的是RelativeLayout 布局的问题,但经过验证,使用linerlayout也同样会出现这个现象,so 排除。
其次:找到相关的xml布局界面,通过验证发现checkBox选中后会出现这个现象,通过方法验证属于item自动扩充。
最后:查看android.preference的源代码终于找到了答案,直接上代码。
/**
* Sets the summary for this Preference with a CharSequence.
*
* @param summary The summary for the preference.
*/
public void setSummary(CharSequence summary) {
if (summary == null && mSummary != null || summary != null && !summary.equals(mSummary)) {
mSummary = summary;
notifyChanged();
}
}
此处总是执行父类的setSummary,summary保持不变,而子类未必需要父类这个summary,在preferenceChangeListener中,setSummary就会导致高度扩充。
解决方法:覆盖父类的setSummary,同时在onBindVie中不指定setSummary(value)。
@Override
public void setSummary(CharSequence summary)
{
if (summary == null && this.summary != null || summary != null && !summary.equals(this.summary)) {
this.summary = summary;
super.setSummary(null);
notifyChanged();
}
}