在Android中让Preference的宽度占满整个屏幕的宽度
今天遇到一个问题,需要修改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的外观和位置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决