官方有话这样说:

A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:

  • FrameLayout
  • LinearLayout
  • RelativeLayout

And the following widget classes:

  • AnalogClock
  • Button
  • Chronometer
  • ImageButton
  • ImageView
  • ProgressBar
  • TextView
  • ViewFlipper
  • ListView
  • GridView
  • StackView
  • AdapterViewFlipper

Descendants of these classes are not supported.不支持这些类的后代

接下来的示例说明怎么样实现 使用ListView、GridView、StackView、ViewFlipper创建AppWidget

menifest

                                                                                          

res/xml/set_widget_provider.xml

<?xml version="1.0" encoding="utf-8"?>

layout/collections_view_widget.xml

<?xml version="1.0" encoding="utf-8"?>            


集合的数据源 需要 继承  RemoteViewsService

package com.stone.service;import java.util.ArrayList;import java.util.List;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.widget.RemoteViews;import android.widget.RemoteViewsService;import com.stone.R;import com.stone.receiver.WidgetSetProvider;/** * 继承自RemoteViewsService 必须重写onGetViewFactory * 该服务只是用来 创建 集合widget使用的数据源 * @author stone */public class WidgetSetService extends RemoteViewsService {public WidgetSetService() {}@Overridepublic RemoteViewsFactory onGetViewFactory(Intent intent) {return new WidgetFactory(this.getApplicationContext(), intent);}public class WidgetFactory implements RemoteViewsService.RemoteViewsFactory {private static final int mCount = 10;private Context mContext;private List mWidgetItems = new ArrayList();public WidgetFactory(Context context, Intent intent) {        mContext = context;//        mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,//                AppWidgetManager.INVALID_APPWIDGET_ID);    }@Overridepublic void onCreate() {for (int i = 0; i < mCount; i++) {                mWidgetItems.add("item:" + i + "!");            }}@Overridepublic void onDataSetChanged() {/* * appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.listview); * 使用该通知更新数据源,会调用onDataSetChanged */System.out.println("----onDataSetChanged----");}@Overridepublic void onDestroy() {mWidgetItems.clear();}@Overridepublic int getCount() {return  mCount;}@Overridepublic RemoteViews getViewAt(int position) {RemoteViews views = new RemoteViews(mContext.getPackageName(), android.R.layout.simple_list_item_1);views.setTextViewText(android.R.id.text1, "item:" + position);System.out.println("RemoteViewsService----getViewAt" + position);Bundle extras = new Bundle();            extras.putInt(WidgetSetProvider.EXTRA_ITEM, position);            Intent fillInIntent = new Intent();            fillInIntent.putExtras(extras);            /*             * android.R.layout.simple_list_item_1 --- id --- text1             * listview的item click:将fillInIntent发送,             * fillInIntent它默认的就有action 是provider中使用 setPendingIntentTemplate 设置的action             */views.setOnClickFillInIntent(android.R.id.text1, fillInIntent);return views;}@Overridepublic RemoteViews getLoadingView() {/* 在更新界面的时候如果耗时就会显示 正在加载... 的默认字样,但是你可以更改这个界面 * 如果返回null 显示默认界面 * 否则 加载自定义的,返回RemoteViews */return null;}@Overridepublic int getViewTypeCount() {return 1;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic boolean hasStableIds() {return false;}}}

widgetprovider

package com.stone.receiver;import com.stone.R;import com.stone.service.WidgetSetService;import android.app.PendingIntent;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.text.TextUtils;import android.text.format.DateUtils;import android.view.View;import android.widget.RemoteViews;import android.widget.Toast;import android.widget.ViewFlipper;/** * 使用了集合展示AppWidget * ListView、GridView、StackView 设置adapter,处理item点击 * ViewFlipper 在RemoteViews中缺少支持,暂只能在它的布局文件中设置 轮换效果 * 对于切换到哪一个子view的item事件不好处理,只能设置一个整体setPendingIntent * @author stone */public class WidgetSetProvider extends AppWidgetProvider {public final static String CLICK_ACTION = "com.stone.action.clickset";public final static String CLICK_ITEM_ACTION = "com.stone.action.clickset.item";public final static String EXTRA_ITEM = "extra_item";@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);System.out.println(intent.getAction());if (TextUtils.equals(CLICK_ACTION, intent.getAction())) {int extraType = intent.getIntExtra("view_tag", 0);if (extraType > 0) {System.out.println("extra:::" + extraType);switch (extraType) {case 1:updateWidget(context, R.id.listview, R.id.gridview, R.id.stackview, R.id.viewflipper);break;case 2:updateWidget(context, R.id.gridview, R.id.listview, R.id.stackview, R.id.viewflipper);break;case 3:updateWidget(context, R.id.stackview, R.id.gridview, R.id.listview, R.id.viewflipper);break;case 4:updateWidget(context, R.id.viewflipper, R.id.gridview, R.id.stackview, R.id.listview);break;default:break;}} } else if (TextUtils.equals(CLICK_ITEM_ACTION, intent.getAction())) {Bundle extras = intent.getExtras();int position = extras.getInt(WidgetSetProvider.EXTRA_ITEM, -1);if (position != -1) {System.out.println("--点击了item---" + position);System.out.println("");//Toast.makeText(context, "click item:" + position, 0).show();}}}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.collections_view_widget);Intent intent1 = new Intent(CLICK_ACTION);intent1.putExtra("view_tag", 1);PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 101, intent1, 0);views.setOnClickPendingIntent(R.id.btn_listview, pendingIntent1);Intent intent2 = new Intent(CLICK_ACTION);intent2.putExtra("view_tag", 2);PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 102, intent2, 0);views.setOnClickPendingIntent(R.id.btn_gridview, pendingIntent2);Intent intent3 = new Intent(CLICK_ACTION);intent3.putExtra("view_tag", 3);PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 103, intent3, 0);views.setOnClickPendingIntent(R.id.btn_stackview, pendingIntent3);Intent intent4 = new Intent(CLICK_ACTION);intent4.putExtra("view_tag", 4);PendingIntent pendingIntent4 = PendingIntent.getBroadcast(context, 104, intent4, 0);views.setOnClickPendingIntent(R.id.btn_viewflipper, pendingIntent4);appWidgetManager.updateAppWidget(appWidgetIds, views);System.out.println("setwidget update");super.onUpdate(context, appWidgetManager, appWidgetIds);}@Overridepublic void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId,Bundle newOptions) {super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,newOptions);}@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}@Overridepublic void onEnabled(Context context) {super.onEnabled(context);}@Overridepublic void onDisabled(Context context) {super.onDisabled(context);}private void updateWidget(Context context, int visible, int gone1, int gone2, int gone3) {//RemoteViews处理异进程中的ViewRemoteViews views = new RemoteViews(context.getPackageName(), R.layout.collections_view_widget);views.setViewVisibility(visible, View.VISIBLE);views.setViewVisibility(gone1, View.GONE);views.setViewVisibility(gone2, View.GONE);views.setViewVisibility(gone3, View.GONE);if (visible != R.id.viewflipper) {//viewflipper 不是 继承自AbsListView  or  AdapterViewAnimator  的viewIntent intent = new Intent(context, WidgetSetService.class);views.setRemoteAdapter(visible, intent);//设置集合的adapter为intent指定的serviceviews.setEmptyView(visible, R.id.tv_empty);//指定集合view为空时显示的viewIntent toIntent = new Intent(CLICK_ITEM_ACTION);PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 200, toIntent, PendingIntent.FLAG_UPDATE_CURRENT);/* * setPendingIntentTemplate 设置pendingIntent 模板 * setOnClickFillInIntent   可以将fillInIntent 添加到pendingIntent中 */views.setPendingIntentTemplate(visible, pendingIntent);} else if (visible == R.id.viewflipper) {//views.setPendingIntentTemplate(R.id.viewflipper, pendingIntentTemplate);}AppWidgetManager am = AppWidgetManager.getInstance(context);int[] appWidgetIds = am.getAppWidgetIds(new ComponentName(context, WidgetSetProvider.class));for (int i = 0; i < appWidgetIds.length; i++) {am.updateAppWidget(appWidgetIds[i], views); //更新 实例}}}

运行的周期函数

Android Widget 小部件(四---完结) 使用ListView、GridView、StackView、ViewFlipper展示Widget_第1张图片

点击stackview的效果图

Android Widget 小部件(四---完结) 使用ListView、GridView、StackView、ViewFlipper展示Widget_第2张图片



更多相关文章

  1. **android studio 编写淘宝界面## 标题**
  2. android 界面控件被输入法顶起来解决
  3. android 登录界面
  4. Android 分享一个流量显示界面
  5. 启动图启动界面的简单实现
  6. 禁止Activity+ EditText 界面默认弹出键盘
  7. android 输入法界面显示的开关

随机推荐

  1. Android(安卓)Project Structure
  2. Universal-Image-Loader(android图片缓存)
  3. Android兼容性测试框架(CTS)手册
  4. Android初步了解入门
  5. android animation
  6. Android(安卓)打开本地文件兼容7.0
  7. Android(安卓)ListView元素间隙线自定义
  8. 界面开发中布局属性全面剖析
  9. Android(安卓)Power Management
  10. 7715平台修改BUG记录