本文总结widget的制作方法 以iper为例
1. widget界面的layout 定义 存放路径 /res/layout/iper_widget.xml. 这里要注意 制作widget与其他不同, 最好在layout中设置好固定设备元素大小.
标记定义了Widget的大小,默认布局和创建Widget实例时的启动行为配置,为了让Widget在主屏幕上更好地显示,Widget必须保持一定的大小,主屏幕分为特定大小的单元格,Google提供的基本原则是用你想占用的单元格数量乘以74,再减去2。在这个例子中,Widget应该是一个正方形,长和宽都各占两个单元格,因此大小就是74*2-2=146.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="294dp" android:layout_height="72dp" android:background="@drawable/iper_shape" android:gravity="left|center_vertical">
<TextView android:layout_width="wrap_content" android:text="IP:" android:layout_weight="1" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="fill_parent" android:gravity="left"></TextView>
<TextView android:layout_width="wrap_content" android:id="@+id/tvIp" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="fill_parent" android:gravity="left"></TextView>
</LinearLayout>
其中 iper_shape 是一个控制显示效果的渐变器 /res/drawable/iper_shape.xml 代码:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF"
android:angle="270"/>
<padding android:left="50dp" android:top="20dp"
android:right="7dp" android:bottom="7dp" />
<corners android:radius="8dp" />
</shape>
2. appwidget-provider 这里定义了widget的大小,更新速度, 以及widget界面layout文件 文件存放地址 /res/xml/iper_info.xml
<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider
android:minWidth="294dp"
android:minHeight="72dip"
android:updatePeriodMillis="600000"
android:initialLayout="@layout/iper_widget"
xmlns:android="http://schemas.android.com/apk/res/android" />
3. 最后在AndroidManifest.xml 中添加
<receiver android:name="IperWidget">
<intent-filter>
<action android:name = "android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<meta-data android:name ="android.appwidget.provider" android:resource="@xml/iper_info">
</meta-data>
</receiver>
</application>
4. 当然要建立一个继承于AppWidgetProvider 的类 IperWidget
package com.iper;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.widget.RemoteViews;
public class IperWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.iper_widget);
String ip = getIp(context);
remoteView.setTextViewText(R.id.tvIp, ip);
appWidgetManager.updateAppWidget(appWidgetIds, remoteView);
//super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private String getIp(Context context){
if(Utils.isNetAvailable(context)){
return Utils.getWifiIpAddress(context);
} else {
return "INTNET failure";
}
}
}
这样一个显示ip地址的widget就完成了