1. 程式人生 > >Android4.0設置界面改動總結(二)

Android4.0設置界面改動總結(二)

idg 手機 中新 pop istview _id 實例 cycle 系統應用

今年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設置界面改動總結(二)