On Android 4.4

遇到过这种问题:

注意到。上面的ActionBar部分的左右各有48像素的padding。

要了解该问题的成因,要首先了解其结构:

  1. 该页面的Activity是一个PreferenceActivity,是个三级页面,是通过上一个PreferenceActivity调用startWithFragment启动的;
  2. 该页面的内容是放置了一个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的更多相关文章

  1. 在Amazon FreeRTOS V10中使用运行时统计信息

    在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考 ...

  2. 在php中定义常量时,const与define的区别?

    问]在php中定义常量时,const与define的区别?  [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...

  3. AndRodi Strudio中的按钮时件

    AndRodi Studio中的按钮时件注册一定要写在onCraete中 @Override protected void onCreate(Bundle savedInstanceState) { ...

  4. 在MySQL向表中插入中文时,出现:incorrect string value 错误

    在MySQL向表中插入中文时,出现:incorrect string value 错误,是由于字符集不支持中文.解决办法是将字符集改为GBK,或UTF-8.      一.修改数据库的默认字符集   ...

  5. Android Tips: 在给drawable中添加图片资源时,文件名必须全小写

    在给drawable中添加图片资源时,文件名必须全小写

  6. 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可

    在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可

  7. 使用ueditor中的setContent() 时经常报innerHtml错误(笔记)

    1)今天遇到个问题,使用ueditor中的setContent() 时经常报innerHtml错误:网上找了下解决方案:发现这个可以用: 不能创建editor之后马上使用ueditor.setCont ...

  8. 在Linux下安装PHP过程中,编译时出现错误的解决办法

    在Linux下安装PHP过程中,编译时出现configure: error: libjpeg.(a|so) not found 错误的解决办法 configure: error: libjpeg.(a ...

  9. Java中字符串比较时==和equals的区别

    ==是比较两个字符串引用的地址是否相同,即是否指向同一个对象,而equals方法则比较字符串的内容是否相同. 例如String a = "abc"; String b = &quo ...

随机推荐

  1. JS日历控件集合----附效果图、源代码

    http://www.cnblogs.com/yank/archive/2008/08/14/1267746.html 在进行开发的过程中,经常需要输入时间,特别是在进行查询.统计的时候,时间限定更为 ...

  2. VirtualBox安装部署的Ubuntu16.04的步骤

    1.下载ubuntu16.04镜像 http://cn.ubuntu.com/download/ 以及虚拟机软件VirtualBox https://www.virtualbox.org/wiki/D ...

  3. vi / vim 设置

    一.vi下方向键输入后,出现ABCD,解决方法: 在vi中输入:set nocp 按回车即可. 二.设置TAB缩进4个空格: 为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方 ...

  4. 树链剖分【p3038】[USACO11DEC]牧草种植Grass Planting

    表示看不太清. 概括题意 树上维护区间修改与区间和查询. 很明显树剖裸题,切掉,细节处错误T了好久 TAT 代码 #include<cstdio> #include<cstdlib& ...

  5. bzoj 3864: Hero meet devil

    bzoj3864次元联通们 第一次写dp of dp (:з」∠) 不能再颓废啦 考虑最长匹配序列匹配书转移 由于dp[i][j]的转移可由上一行dp[i-1][j-1],dp[i-1][j],dp[ ...

  6. [COCI2017-2018 Contest5] Birokracija

    题目描述 Mirko has become CEO of a huge corporation. This corporation consists of ​N people, labeled fro ...

  7. Ubuntu 16.04桌面版GUI网络配置工具NetworkManager的命令行工具nm-tool无法使用的问题

    说明: 1.Ubuntu中分桌面版和服务器版,而这两个版本在网络管理方面使用的工具都不一样,尤其是在桌面版,使用了NetworkManager进行管理. 2.服务器版使用的是命令行配置,而桌面版包含了 ...

  8. Matlab绘图时横坐标重叠怎么办

    如横坐标重叠了,咋回事?蛋疼. 后来发现plot里已经横坐标1到50了,我又写了个 set(gca,'XTick',1:1:50);没写XTickLabel,后来我把XTick注视了就好了.

  9. LinuxPAServer19.0.tar.gz压缩包

    LinuxPAServer19.0.tar.gz DELPHI XE10.2(TOKYO)开始可以编写LINUX控制台程序.在LINUX上面需要部署LinuxPAServer19.0.tar.gz,即 ...

  10. VBA 时间相关的函数

    DateSerial DateADD Datediff http://www.yiibai.com/vba/vba_datediff_function.html https://www.techont ...