【達內課程】Android中的AppWidget
阿新 • • 發佈:2018-12-26
1、佈局activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" android:gravity="center"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Button1"/> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Button2"/> </LinearLayout> </LinearLayout>
2、配置檔案meta.xml
Root element寫
appwidget-provider
佈局佔幾個格子是有公式的
70N-30
如果我們的小部件是一個4X1的佈局,那麼,
70x4-30=250
70x1-30=40
所以最終meta.xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="250dp" android:minHeight="40dp" android:initialLayout="@layout/activity_main" > </appwidget-provider>
3、控制器MyappWidget
MyappWidget 必須extends AppWidgetProvider
4、別忘記在AndroidManifest中註冊
<receiver android:name=".MyappWidget"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/meta" /> </receiver>
執行程式後,就可以使用這個小部件了
下面重點來看MyappWidget
需要重寫4個方法
public class MyappWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.i("info","onUpdate...");
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Log.i("info","onDeleted...");
}
@Override
public void onEnabled(Context context) {
Log.i("info","onEnabled...");
}
@Override
public void onDisabled(Context context) {
Log.i("info","onDisabled...");
}
}
/**
* AppWidget控制類
*/
public class MyappWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.i("info","onUpdate..."+ Arrays.toString(appWidgetIds));
//manager
//remoteviews
//updateAppWidget
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main);
views.setTextColor(R.id.tv, Color.RED);
views.setTextViewText(R.id.tv,"Hello world");
appWidgetManager.updateAppWidget(appWidgetIds,views);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Log.i("info","onDeleted..."+ Arrays.toString(appWidgetIds));
}
@Override
public void onEnabled(Context context) {
Log.i("info","onEnabled...");
}
@Override
public void onDisabled(Context context) {
Log.i("info","onDisabled...");
}
}
現在實現點選按鈕1開啟Activity
//給button1新增點選意圖
Intent intent = new Intent(context,MainActivity.class);
PendingIntent pi1 = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btn1,pi1);
現在點選button2讓textview改變隨機一個顏色
//給button2新增點選意圖,傳送自定義廣播
Intent i2 = new Intent("ACTION_BUTTON2_CLICKED");
i2.setComponent(new ComponentName(context,MyappWidget.class));
PendingIntent pi2 = PendingIntent.getBroadcast(context,0,i2,PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btn2,pi2);
appWidgetManager.updateAppWidget(appWidgetIds,views);
AndroidManifest.xml中註冊,由於MyappWidget父類是BroadcastReceiver,所以直接註冊
<receiver android:name=".MyappWidget">
<intent-filter>
<action android:name="ACTION_BUTTON2_CLICKED"/>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/meta"
/>
</receiver>
MyappWidget中重寫onReceive方法
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.i("info","onUpdate..."+ Arrays.toString(appWidgetIds));
//manager
//remoteviews
//updateAppWidget
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main);
views.setTextColor(R.id.tv, color);
views.setTextViewText(R.id.tv,"Hello world");
//給button1新增點選意圖
Intent intent = new Intent(context,MainActivity.class);
PendingIntent pi1 = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btn1,pi1);
//給button2新增點選意圖,傳送自定義廣播
Intent i2 = new Intent("ACTION_BUTTON2_CLICKED");
i2.setComponent(new ComponentName(context,MyappWidget.class));
PendingIntent pi2 = PendingIntent.getBroadcast(context,0,i2,PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btn2,pi2);
appWidgetManager.updateAppWidget(appWidgetIds,views);
}