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. centos dhcp获取不到ip解决方法 Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization.

    1.删除文件: /etc/udev/rules.d/70-persistent-net.rules 2.编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 删除H ...

  2. List<?>和List<Class<?>>区别及泛型相关

    ?表示是任意类型,但是编译器不能确定他是什么类型,所以你add的时候什么参数也不能传给它Class<?>表示任意类型的Class对象,list里面可以添加任何类型的Class对象,其它的对 ...

  3. 1.Openstack-环境安装

    Centos7 OpenStack环境安装 Ifcofnig vim命令 Centos7最小化安装后如没有ifconfig vim命令,执行: 1 yum install -y net-tools v ...

  4. python--控制窗体

    窗体的显示和隐藏 #!/usr/bin/env python # -*- coding:utf-8 -*- # author:love_cat import win32con import win32 ...

  5. hdu 1142(迪杰斯特拉+记忆化搜索)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  6. 针对各地项目icomet停止服务的临时处理办法

    1.编辑一个脚本 vi /usr/local/watchicomet.sh #!/bin/bash sn=`ps -ef | grep ./icomet-server | grep -v grep | ...

  7. 【原创】DataPackage-数据库、表的区域设置和系统不一致导致处理失败

    问题描述: 最近学习Datapackage,创建完之后,部署处理但总是提示某某字段的区域设置和目标字段的区域设置不一致,具体如图: 测试发现其它的数据库表又没有这类的问题发生,甚是苦恼,搜寻了好久,后 ...

  8. [scrapy] 爬了第一页就停止 filtered off site request to

    我碰到这个问题的原因是 allowed_domains 写错了 至于还有没有别的原因就不知道了

  9. JDBC二部曲之_入门

    JDBC 1 什么是JDBC? JDBC(Java DataBase Connectivity),即Java数据库连接!也就是说,Java程序员可以使用JDBC API来操作数据库. 最早JDBC是J ...

  10. Python的程序结构[4] -> 函数/Function[1] -> 内建函数

    内建函数 / Built-in Function or Method Python中有许多的内建函数(查看内建模块部分),此处将对内建函数进行介绍 内建函数 ord / built-in functi ...