今天遇到一个问题,需要修改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的外观和位置。

更多相关文章

  1. Android布局优化几个重要标签的使用include、merge、ViewStub、r
  2. 关于如何实现android状态栏沉淀式效果
  3. 【Android(安卓)初学】6、线性布局--深入LinearLayout
  4. 如何在Android(安卓)NDK中调用第三方库文件(.so)
  5. Android代码实现WiFi连接
  6. android中生成keystore
  7. NDK HOWTO
  8. Android高性能的布局
  9. Android(安卓)Studio将本地计算机文件上传到模拟器scard文件中

随机推荐

  1. mysql5.7 生成列 generated column用法实
  2. mysql8 公用表表达式CTE的使用方法实例分
  3. mysql中left join设置条件在on与where时
  4. mysql5.7 新增的json字段类型用法实例分
  5. mysql中各种常见join连表查询实例总结
  6. mysql 主从数据不一致,提示: Slave_SQL_Ru
  7. mysql 中 replace into 与 insert into o
  8. 解决MySQL server has gone away错误的方
  9. centos7环境下创建mysql5.6多实例的方法
  10. centos7环境下二进制安装包安装 mysql5.6