今天遇到一个问题,需要修改Preference的宽度,让其与屏幕宽度一致。搞了一上午。
终于发现Preference的这个尺寸是在PreferenceFrameLayout中设置的。通过下面这段代码,
mBorderTop = a.getDimensionPixelSize(
com.android.internal.R.styleable.PreferenceFrameLayout_borderTop,
defaultBorderTop);
mBorderBottom = a.getDimensionPixelSize(
com.android.internal.R.styleable.PreferenceFrameLayout_borderBottom,
defaultBottomPadding);
mBorderLeft = a.getDimensionPixelSize(
com.android.internal.R.styleable.PreferenceFrameLayout_borderLeft,
defaultLeftPadding);
mBorderRight = a.getDimensionPixelSize(
com.android.internal.R.styleable.PreferenceFrameLayout_borderRight,
defaultRightPadding);
我们可以发现,可以在主题中对其进行定制。
在系统的主题中,我们可以看到如下语句
<!-- PreferenceFrameLayout attributes -->
<item name="preferenceFrameLayoutStyle">@android:style/Widget.Holo.PreferenceFrameLayout</item>
我们在看看这个定义
<style name="Widget.Holo.PreferenceFrameLayout">
<item name="android:borderTop">0dip</item>
<item name="android:borderBottom">@dimen/preference_fragment_padding_bottom</item>
<item name="android:borderLeft">@dimen/preference_fragment_padding_side</item>
<item name="android:borderRight">@dimen/preference_fragment_padding_side</item>
</style>
其中左右边界都不是0,所以,我们看到在3.0之后的版本的Preference的左右两边都有一定的距离,二以前的版本这两个值是0.其定义如下:
<style name="Widget.PreferenceFrameLayout">
<item name="android:borderTop">0dip</item>
<item name="android:borderBottom">0dip</item>
<item name="android:borderLeft">0dip</item>
<item name="android:borderRight">0dip</item>
</style>
在我们自动的主题中,我们可以自定义一个这个的主题。本来以为这样可以完事大吉了。结果发现这几个值不是Public的。应用不能自定义。
坏了。
最后,发现在PreferenceActivity和PreferenceFragment中,创建View的时候,用的是布局文件preference_list_content和preference_list_fragment.xml
决定打开看看。发现原来这个边界还可以在布局文件中控制。我这里用的是PreferenceFragment.Activity的应该类似。不过我并没有做实验。
有两种改法。方法一,在Fragment中的onCreateView的时候,用我们自己的的Layout文件替代系统的Layout文件。只是注意文件的Id和布局要和系统的一样。
只不过把文件中设置ListView的Padding的地方改掉就可以了。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.my_preference_list_fragment, container,
false);
}
方法二:任然使用系统提供的Layout,只不过在onCreateView中用代码设置Padding,代码如下。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View parent = super.onCreateView(inflater, container, savedInstanceState);
if(null != parent)
{
View listView = parent.findViewById(android.R.id.list);
if(null != listView)
{
listView.setPadding( 0, listView.getPaddingTop(), 0, listView.getPaddingBottom());
}
}
return parent;
}
顺便提一下,在实验过程中,发现,如果要修改PreferanceCaegory的Layout定义是在preference_category_holo.xml中。
我们完全可以做一个类似的布局文件。然后再Preference的XML中,用android:layout指定我们自己的布局文件。
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:attr/listSeparatorTextViewStyle"
android:id="@+android:id/title"
android:paddingLeft="@dimen/preference_item_padding_side"
android:paddingRight="@dimen/preference_item_padding_side" />
我们可以修改这个Padding,和样式,来控制Category的外观和位置。