在前一篇文章里,我们修正了应用小部件外观上的一些小问题。接下来,我们将扩展应用小部件提供一些有关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下载。