码迷,mamicode.com
首页 > 其他好文 > 详细

在PreferenceAcitity中使用Fragement时避免额外的Left和RightPadding

时间:2017-07-29 11:27:58      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:ntp   调用   color   turn   ret   nts   back   over   避免   

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

标签:ntp   调用   color   turn   ret   nts   back   over   避免   

原文地址:http://www.cnblogs.com/mthoutai/p/7253682.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!