zoukankan      html  css  js  c++  java
  • 在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的外观和位置。





  • 相关阅读:
    知识图谱系列---机器学习---PIL图片处理
    知识图谱系列---知识图谱概论(摘录)
    Java系列整理---Python Java Scala 区别
    Java系列整理---Intellij IDEA 封装Jar包(提示错误: 找不到或无法加载主类)
    数据库系列整理---数据库访问优化法则
    hadoop系列整理---Spark基础架构(摘录)
    知识图谱系列---自然语言处理---Word2Vec超详细的原理推导(摘录)
    知识图谱系列---自然语言处理---词向量模型(word2vec) 详解
    知识积累---性能优化与框架搭建
    知识积累---Linux内核的整体架构
  • 原文地址:https://www.cnblogs.com/platte/p/3727632.html
Copyright © 2011-2022 走看看