Android4.0设置界面改动总结(二)

今年1月份的时候。有和大家分享给予Android4.0+系统设置的改动:Android4.0设置界面改动总结

时隔半年。回头看看那个时候的改动。事实上是有非常多问题的,比方说:

①.圆角Item会影响到第三方应用(由于我是公共改动的framework下的PreferenceGroupAdapter嘛)。

②.设置不能横竖屏切换。

因为当时客户催的比較急,没有顾及到。只是后来。我们在做新平台的时候,是有又一次完好的,今天就和大家分享一下。

第一个问题的解决:

①.在PreferenceGroupAdapter中加一个boolean变量mIsRoundCornerPreference,假设为true时返回圆角处理过的view,为false时则返回原来的view。代码例如以下:

        // start by liweiping 20140523
        View view = preference.getView(convertView, parent);
        if (!mIsRoundCornerPreference) {
            return view;
        } else {
            if (mPreferenceListBackgroundIndex.get(position) == SINGLE_LINE_ROUND_CORNER_BACKGROUND) {
                view.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_single);
            } else if (mPreferenceListBackgroundIndex.get(position) == TOP_ROUND_CORNER_BACKGROUND) {
                view.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_top);
            } else if (mPreferenceListBackgroundIndex.get(position) == CENTER_RECTANGLE_BACKGROUND) {
                view.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_center);
            } else if (mPreferenceListBackgroundIndex.get(position) == BOTTOM_ROUND_CORNER_BACKGROUND) {
                view.setBackgroundResource(com.android.internal.R.drawable.easy_pref_item_bottom);
            }
            return view;
        }
        //end by liweiping 20140523

②.mIsRoundCornerPreference这个变量是通过读取attrs.xml中的属性来获取的,在实例化PreferenceGroupAdapter对象的时候即读取,详细代码例如以下:

    public PreferenceGroupAdapter(PreferenceGroup preferenceGroup) {
        mPreferenceGroup = preferenceGroup;
        // If this group gets or loses any children, let us know
        mPreferenceGroup.setOnPreferenceChangeInternalListener(this);

        mPreferenceList = new ArrayList<Preference>();
        mPreferenceLayouts = new ArrayList<PreferenceLayout>();
        //start by liweiping 20140523
        TypedArray a = mPreferenceGroup.getContext().obtainStyledAttributes(null,
                R.styleable.RoundCornerPreference, 0, 0);
        mIsRoundCornerPreference = a.getBoolean(R.styleable.RoundCornerPreference_isRoundCorner, false);
        a.recycle();
        //end by liweiping 20140523
        syncMyPreferences();
    }

③.须要在attrs.xml中添加一个属性,详细例如以下(另外一个属性是我新增的一个ListView的Style,临时忽略掉吧):

    <declare-styleable name="RoundCornerPreference">
        <attr name="isRoundCorner" format="boolean" />
    <attr name="listViewStyleTopwise" format="reference" />
    </declare-styleable>

④.我们在theme.xml中新增一个主题(注意在public.xml文件里注冊,否则编译时可能会报错,找不到该主题)继承系统自带的主题。比方说Theme.Holo或者Theme.Holo.Light,在该主题的子节点中将attrs.xml中的isRoundCorner属性赋值为true。

例如以下所看到的(我这里还又一次赋值一下系统其他属性,请忽视):

    <style name="Theme.Holo.Light.Topwise">
    <item name="listSeparatorTextViewStyle">@android:style/Widget.Holo.Light.TextView.ListSeparator.Topwise</item>
        <item name="textAppearanceMedium">@android:style/TextAppearance.Holo.Light.Medium.Topwise</item>
        <item name="isRoundCorner">true</item>
    <item name="listViewStyleTopwise">@android:style/Widget.Holo.Light.ListView.Topwise</item>
    <item name="textColorSecondary">@android:drawable/selector_text_summary</item>
    <item name="textAppearanceSmall">@android:style/TextAppearance.Holo.Light.Small.Topwise</item>
    </style>

⑤.将我们的Settings应用的主题改动为新增的Theme.Holo.Light.Topwise。这样就基本上完工了,圆角风格的选择项仅仅会影响到设置应用。其他应用还是会和之前一样的风格。

总结:假设读者能非常好的理解了attrs.xml、styles.xml、themes.xml、public.xml这几个文件直接的关系。就应该非常easy想到通过这种方式来实现多样的配置、多样的主题。

事实上。參考小米、OPPO、魅族等主流厂商的设计,他们有自己封装一个framework,也就是说,自己系统应用使用的是自己的framework。第三方应用使用的是原生的framework。这样能非常方便的添加各种新功能、新接口。同一时候还不至于影响到第三方应用。

这是一个非常好的办法,但也是有缺点的:占用手机空间会加大(这对于眼下动则16GB、64GB的手机来说事实上也是九牛一毛)。所以,这也是一个大势所趋。

好了,今天就和大家分析到这里,关于第二个问题的改动,下次再分析。

谢谢!

假设有什么问题,欢迎留言讨论。

时间: 2024-08-07 14:34:31

Android4.0设置界面改动总结(二)的相关文章

Android4.0设置界面改动总结(三)

Android4.0设置界面改动总结大概介绍了一下设置改tab风格,事实上原理非常easy,理解两个基本的函数就可以: ①.invalidateHeaders(),调用此函数将又一次调用onBuildHeader()来又一次读取xml文件里的header,又一次刷新HeaderAdapter中的数据,因此刷新了ListView的内容,从而更新了界面. ②.onBuildHeaders()中调用loadHeadersFromResource(resId, headers); 就可以又一次载入Hea

Android4.0设置界面修改总结(四)

之前有跟大家分享设置Tab风格和Item圆角的实现,希望能给有需要的朋友一点点帮助,今天再和大家分享一下用ViewPager实现设置分页,小米和OPPO就是这样的设置,先来看看效果图:   为了帮助大家更清晰的理解,我单独拿出一个小例子,有需要的朋友可以下载下来看看: http://git.oschina.net/way/SettingTab/tree/master 其实要实现这样的风格并不难,只要能比较深入的理解PreferenceActivity.java就可以了.我们都知道Settings

Android4.0设置界面修改总结(三)

Android4.0设置界面修改总结大概介绍了一下设置改tab风格,其实原理很简单,理解两个主要的函数即可: ①.invalidateHeaders(),调用此函数将重新调用onBuildHeader()来重新读取xml文件中的header,重新刷新HeaderAdapter中的数据,因此刷新了ListView的内容,从而更新了界面. ②.onBuildHeaders()中调用loadHeadersFromResource(resId, headers); 即可重新加载HeaderAdapter

Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 一 图库数据管理 Gallery2的数据管理 DataManager(职责:管理数据源)- MediaSource(职责:管理数据集) - MediaSet(职责:管理数据项).DataManager中初始化所有的数据源(LocalSo

android4.0默认界面旋转180

不巧新拿的android4.0默认启动画面和正常显示旋转了180度,即为倒立的.原来是屏输出为倒的,查找得知可以做旋转: 步骤: 一:先把这个加上 然后加上属性ro.sf.hwrotation = 180 二:在init.rc脚本中添加如下内容:      setprop ro.sf.hwrotation180 修改frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp文件,在voidGraphicPlane::setDisplayH

Android4.0(Phone)拨号启动过程分析(二)

接上:Android4.0(Phone)拨号启动过程分析(一) InCallScreen处理来电和拨号的界面,接通电话也是这个界面,接下来分析InCallScreen类是如何处理拨号流程的: @Override protected void onCreate(Bundle icicle) { Log.i(LOG_TAG, "onCreate()... this = " + this); Profiler.callScreenOnCreate(); super.onCreate(icic

Android4.0+锁屏程序开发——设置锁屏页面篇

[如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. 而且在此界面中,我们可以用一些行为来退出,比如点击按钮等. 还有一个特征是在这个界面的时候,我们通常是不能使用底部的三个按钮的 关于如果屏蔽底部的三个按钮,我已经在另一篇博客Android4.0+锁屏程序开发——按键屏蔽篇进行了总结,有需要的朋友可以参看. 这篇博客我们主要讨论如何让一个Activ

Android4.0的Alertdialog对话框,设置点击其他位置不消失

Android4.0以上AlertDialog,包括其他自定义的dialog,在触摸对话框边缘外部,对话框消失. 可以设置这么一条属性,当然必须先AlertDialog.Builder.create()之后才能调用这两个方法 方法一: setCanceledOnTouchOutside(false);调用这个方法时,按对话框以外的地方不起作用.按返回键还起作用 方法二: setCancelable(false);调用这个方法时,按对话框以外的地方不起作用.按返回键也不起作用

android4.0.4 增加HDMI设置

最近到4412最基本的都调了 然后觉得没事做了 所以增加一个HDMI的设置 不能闲着 以下使用的是广州斯道的icool210开发板 源码修改如下 最开始我是先在设置里加上这些设置然后在去实现功能 这里就一起说了 之前android2.3里有HDMI设置所以这里就参照那个增加 首先修改Setting 查看libhdmi库首先查看下hdmi能设置的格式 源码路径 device/samsung/common/s5p/libhdmi/SecHdmi.cpp 你会发现有如下代码 mHdmiResoluti