本文總結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就完成了