1. 程式人生 > >【達內課程】Android中的AppWidget

【達內課程】Android中的AppWidget

在這裡插入圖片描述

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);
    }