转自:http://blog.csdn.net/way_ping_li/article/details/29849771
今年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
// 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();
- }
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>
<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>
<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这几个文件直接的关系,就应该很容易想到通过这样的方式来实现多样的配置、多样的主题。
其实,参考小米、OPPO、魅族等主流厂商的设计,他们有自己封装一个framework,也就是说,自己系统应用使用的是自己的framework,第三方应用使用的是原生的framework,这样能很方便的增加各种新功能、新接口,同时还不至于影响到第三方应用。这是一个很好的办法,但也是有缺点的:占用手机空间会加大(这对于目前动则16GB、64GB的手机来说其实也是九牛一毛)。所以,这也是一个大势所趋。
好了,今天就和大家分析到这里,关于第二个问题的修改,下次再分析。谢谢!
如果有什么问题,欢迎留言讨论。