今天遇到一个问题,需要修改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);我们可以发现,可以在主题中对其进行定制。在系统的主题中,我们可以看到如下语句- @android:style/Widget.Holo.PreferenceFrameLayout
我们在看看这个定义 其中左右边界都不是0,所以,我们看到在3.0之后的版本的Preference的左右两边都有一定的距离,二以前的版本这两个值是0.其定义如下: 在我们自动的主题中,我们可以自定义一个这个的主题。本来以为这样可以完事大吉了。结果发现这几个值不是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指定我们自己的布局文件。我们可以修改这个Padding,和样式,来控制Category的外观和位置。