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的手機來說事實上也是九牛一毛)。所以,這也是一個大勢所趨。
好了,今天就和大家分析到這裏,關於第二個問題的改動,下次再分析。
謝謝!
假設有什麽問題,歡迎留言討論。
Android4.0設置界面改動總結(二)