在前一篇文章裡,我們修正了應用小部件外觀上的一些小問題。接下來,我們將擴充套件應用小部件提供一些有關Android新版本的功能,同時兼顧向後相容性。
我們要做的第一件事情,是將我們的小部件新增到鎖屏介面中。Android 4.2版本中引入了新增小部件到鎖屏介面功能,實際上實現這個過程非常容易。所有需要做的只是新增幾行程式碼到res/xml/appwidget-info.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="110dp" android:minHeight="40dp" android:updatePeriodMillis="86400000" android:initialLayout="@layout/appwidget" android:previewImage="@drawable/widget" android:resizeMode="none" android:widgetCategory="home_screen|keyguard" android:initialKeyguardLayout="@layout/appwidget"> </appwidget-provider> |
所有這些都是4.2版本出現的新功能,老版本對此會完全忽略。因此,無需做任何事情就可以保持軟體的向後相容性。
widgetCategory
屬性可以讓我們指定將提供哪一種小部件。在示例中,我們提供了一個標準主螢幕小部件,同時一個鍵盤鎖(keyguard)小部件將會新增到鎖屏介面。Android 4.2版本裝置的預設值是home_screen(主螢幕),因此我們的應用不支援鍵盤鎖屬性。
initialKeyguardLayout
屬性指定了鎖屏介面中使用的佈局。一開始,我們使用和主螢幕小部件相同的佈局。
如果啟動應用,現在可以在鎖屏介面下方向左滑動新增鎖屏介面小部件。按下“+”按鈕,然後從從備選小部件列表中選擇文字時鐘。
新增完成後,我們的鎖屏介面看起來像這樣:
這樣就好了。但是時間的邊框顯示得不夠好,因此我們應該讓它變得更大一些。事實上,我們不需要像在主螢幕上那樣將它同其它部件分開,因此可以去除所有的背景。我們會在res/layout/keyguard.xml中定義一個分離的佈局
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" style="@style/hoursTextKeyguard" android:gravity="bottom" android:id="@+id/hours"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/minutesTextKeyguard" android:layout_marginTop="-10dp" android:layout_marginBottom="-10dp" android:id="@+id/tens"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" style="@style/minutesTextKeyguard" android:id="@+id/minutes"/> </LinearLayout> |
這裡同時需要新增一些新的樣式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="hoursTextWidget"> <item name="android:textSize">@dimen/widget_text_height</item> <item name="android:textColor">@color/holo_blue_bright</item> <item name="android:textStyle">bold</item> </style> <style name="minutesTextWidget" parent="hoursTextWidget"> <item name="android:textColor">@color/holo_blue_light</item> <item name="android:textStyle">normal</item> </style> <style name="hoursTextKeyguard" parent="hoursTextWidget"> <item name="android:textSize">36sp</item> </style> <style name="minutesTextKeyguard" parent="hoursTextKeyguard"> <item name="android:textColor">@android:color/holo_blue_light</item> <item name="android:textStyle">normal</item> </style> </resources> |
如果裝置支援,我們希望使用“Roboto Light”,因此我們需要改變res/values-v16/styles.xml的內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="minutesTextWidget" parent="hoursTextWidget"> <item name="android:textColor">@android:color/holo_blue_light</item> <item name="android:textStyle">normal</item> <item name="android:fontFamily">sans-serif-light</item> </style> <style name="minutesTextKeyguard" parent="hoursTextKeyguard"> <item name="android:textColor">@android:color/holo_blue_light</item> <item name="android:textStyle">normal</item> <item name="android:fontFamily">sans-serif-light</item> </style> </resources> |
我們還需要改變res/xml/appwidget-info.xml的內容應用
這個新佈局:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="110dp" android:minHeight="40dp" android:updatePeriodMillis="86400000" android:initialLayout="@layout/appwidget" android:previewImage="@drawable/widget" android:resizeMode="none" android:widgetCategory="home_screen|keyguard" android:initialKeyguardLayout="@layout/keyguard"> </appwidget-provider> |
對每一個小部件例項,我們可以從 AppWidgetManager
中獲得的 AppWidgetOptions
Bundle 確定它的型別。預設型別是1(代表一個主螢幕小部件)。我們可以使用常量 AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD
改進程式碼的可讀性,而不是使用魔數2來表示 WIDGET_CATEGORY_KEYGUARD
常量。實際上這會破壞向後相容性,因為 Android 常量是從 API 17 才開始引入,如果這樣做會在更早版本的環境上執行時會發生錯誤。
再次執行,就可以在鎖屏介面中看到新佈局:
現在我們有了一個鎖屏介面小部件,它支援Android 4.2及以後版本的裝置。應用的這個版本可以在Google Play市場上找到對應的1.1.0版本。
下一篇文章裡我們要學習用Android 4.2的另一個新特性來擴充套件應用。
本文的程式碼可以從這裡獲取,TextClock應用可以從Google Play下載。