在PreferenceAcitity中使用Fragement时避免额外的Left和RightPadding
On Android 4.4
遇到过这种问题:
![]()
注意到。上面的ActionBar部分的左右各有48像素的padding。
要了解该问题的成因,要首先了解其结构:
- 该页面的Activity是一个PreferenceActivity,是个三级页面,是通过上一个PreferenceActivity调用startWithFragment启动的;
- 该页面的内容是放置了一个Fragment。该Fragment。实现了自己的ActionBar (ActionBar是来自Fragment而不是Acitivity)
我们通过hierarchyviewer看一下它的界面构成:

截图中的PreferenceFrameLayout就是这个关键类。
PreferenceAcitivity的布局文件是 frameworks/base/core/res/res/layout/preference_list_fragment.xml
可是。PreferenceFrameLayout类的风格却是由android内部的一个风格控制的:(frameworks/base/core/res/res/values/styles.xml)
<stylename="Widget.Holo.PreferenceFrameLayout">
<itemname="android:borderTop">0dip</item>
<itemname="android:borderBottom">@dimen/preference_fragment_padding_bottom</item>
<itemname="android:borderLeft">?attr/preferenceFragmentPaddingSide</item>
<itemname="android:borderRight">?attr/preferenceFragmentPaddingSide</item>
</style>
preferenceFragmentPaddingSide的值在不同平台值不同。在这里定义为16dip (16*3 = 48)
他通过默认风格引用的(frameworks/base/core/res/res/values/themes.xml)
<itemname="preferenceFrameLayoutStyle">@android:style/Widget.PreferenceFrameLayout</item>
这样,在默认情况下,PreferenceActivity都会带有边框Padding。
可是PreferenceFrameLayout另一个特殊属性:layout_removeBorders。
这个属性为true时,表示忽略padding。
他相应的是PreferenceFrameLayout.LayoutParams.removeBorders 这个变量。
PreferenceFragment这个和PreferenceActivity匹配的Fragment,就具有该属性:(frameworks/base/core/res/res/layout/preference_list_fragment.xml)
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@android:color/transparent"
android:layout_removeBorders="true">
.....
因此。PreferenceFragment放到PreferenceActivity的时候。这个边框就没有了。
不幸的时,以上全部的layout属性都是Private的。无法更改,因此,当我们的Fragment不是PreferenceFragment或者它的派生类的时候,就不能消除边框了。
只是,我们还有其它的解决方法,万幸的是PreferenceFrameLayout和PreferenceFrameLayout.LayoutParams都是Public的。因此,我们能够直接代码改动:
@Override
public View onInflateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(
....., container,false);
if(container != null) {
ViewGroup prefView = (ViewGroup)container.getParent();
ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams)prefView.getLayoutParams();
if(layoutParams instanceofPreferenceFrameLayout.LayoutParams) {
((PreferenceFrameLayout.LayoutParams)layoutParams).removeBorders =true;
}
}
returnview;
}
在Fragment的onInflateView函数中强制改动removeBorders就能够达到这种目的。
当然,须要正确找到PreferenceFrameLayout的第一个子View,改动该子View的LayoutParams才干生效,这须要依据不同的情况来分别对待。
在PreferenceAcitity中使用Fragement时避免额外的Left和RightPadding的更多相关文章
- 在Amazon FreeRTOS V10中使用运行时统计信息
在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考 ...
- 在php中定义常量时,const与define的区别?
问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...
- AndRodi Strudio中的按钮时件
AndRodi Studio中的按钮时件注册一定要写在onCraete中 @Override protected void onCreate(Bundle savedInstanceState) { ...
- 在MySQL向表中插入中文时,出现:incorrect string value 错误
在MySQL向表中插入中文时,出现:incorrect string value 错误,是由于字符集不支持中文.解决办法是将字符集改为GBK,或UTF-8. 一.修改数据库的默认字符集 ...
- Android Tips: 在给drawable中添加图片资源时,文件名必须全小写
在给drawable中添加图片资源时,文件名必须全小写
- 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
- 使用ueditor中的setContent() 时经常报innerHtml错误(笔记)
1)今天遇到个问题,使用ueditor中的setContent() 时经常报innerHtml错误:网上找了下解决方案:发现这个可以用: 不能创建editor之后马上使用ueditor.setCont ...
- 在Linux下安装PHP过程中,编译时出现错误的解决办法
在Linux下安装PHP过程中,编译时出现configure: error: libjpeg.(a|so) not found 错误的解决办法 configure: error: libjpeg.(a ...
- Java中字符串比较时==和equals的区别
==是比较两个字符串引用的地址是否相同,即是否指向同一个对象,而equals方法则比较字符串的内容是否相同. 例如String a = "abc"; String b = &quo ...
随机推荐
- JS日历控件集合----附效果图、源代码
http://www.cnblogs.com/yank/archive/2008/08/14/1267746.html 在进行开发的过程中,经常需要输入时间,特别是在进行查询.统计的时候,时间限定更为 ...
- VirtualBox安装部署的Ubuntu16.04的步骤
1.下载ubuntu16.04镜像 http://cn.ubuntu.com/download/ 以及虚拟机软件VirtualBox https://www.virtualbox.org/wiki/D ...
- vi / vim 设置
一.vi下方向键输入后,出现ABCD,解决方法: 在vi中输入:set nocp 按回车即可. 二.设置TAB缩进4个空格: 为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方 ...
- 树链剖分【p3038】[USACO11DEC]牧草种植Grass Planting
表示看不太清. 概括题意 树上维护区间修改与区间和查询. 很明显树剖裸题,切掉,细节处错误T了好久 TAT 代码 #include<cstdio> #include<cstdlib& ...
- bzoj 3864: Hero meet devil
bzoj3864次元联通们 第一次写dp of dp (:з」∠) 不能再颓废啦 考虑最长匹配序列匹配书转移 由于dp[i][j]的转移可由上一行dp[i-1][j-1],dp[i-1][j],dp[ ...
- [COCI2017-2018 Contest5] Birokracija
题目描述 Mirko has become CEO of a huge corporation. This corporation consists of N people, labeled fro ...
- Ubuntu 16.04桌面版GUI网络配置工具NetworkManager的命令行工具nm-tool无法使用的问题
说明: 1.Ubuntu中分桌面版和服务器版,而这两个版本在网络管理方面使用的工具都不一样,尤其是在桌面版,使用了NetworkManager进行管理. 2.服务器版使用的是命令行配置,而桌面版包含了 ...
- Matlab绘图时横坐标重叠怎么办
如横坐标重叠了,咋回事?蛋疼. 后来发现plot里已经横坐标1到50了,我又写了个 set(gca,'XTick',1:1:50);没写XTickLabel,后来我把XTick注视了就好了.
- LinuxPAServer19.0.tar.gz压缩包
LinuxPAServer19.0.tar.gz DELPHI XE10.2(TOKYO)开始可以编写LINUX控制台程序.在LINUX上面需要部署LinuxPAServer19.0.tar.gz,即 ...
- VBA 时间相关的函数
DateSerial DateADD Datediff http://www.yiibai.com/vba/vba_datediff_function.html https://www.techont ...