如何在单个应用程序中使用应用程序小部件创buildAndroid应用

我已经做了一个Android应用程序 ,其中存储与人名和电话号码的date。

现在我必须为这个应用程序开发一个小部件来显示今天(date,人名和电话号码)与button。

要求:

  1. 单一的应用程序和小部件。
  2. 当我点击小部件中的button时,它将启动我的应用程序。
  3. 小工具的数据应该总是与我的应用程序同步 – 当今天(人5和应用程序添加5个人,然后小部件显示10人数据)
  4. 我怎样才能devise这个小部件? 任何指导? 我必须使用水平的ScrollView。

我做了一个简单的小部件演示,但我不知道如何与我的应用程序同步。

请分享您的经验,并对我的小部件和应用程序提供一些想法。

创build和configuration小部件

要注册一个小部件,您需要为android.appwidget.action.APPWIDGET_UPDATE操作创build一个带有意图filter的BroadcastReceiver。

<receiver android:icon="@drawable/icon" android:label="Example Widget" android:name="MyWidgetProvider" > <intent-filter > <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info" /> </receiver> 

你也可以通过android:name =“android.appwidget.provider”属性指定widget的元数据,这个元数据引用的configuration文件包含了widget的configuration设置,如果包含更新界面,大小和小部件的初始布局。

在/ res / drawable目录中创build一个新文件myshape.xml。 这个文件将定义我们在你的小部件中使用的背景。

 <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <stroke android:width="2dp" android:color="#FFFFFFFF" /> <gradient android:angle="225" android:endColor="#DD2ECCFA" android:startColor="#DD000000" /> <corners android:bottomLeftRadius="7dp" android:bottomRightRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp" /> </shape> 

在res / layout文件夹下定义以下widget_layout.xml文件。

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="8dip" android:background="@drawable/myshape" > <TextView android:id="@+id/update" style="@android:style/TextAppearance.Medium" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center_horizontal|center_vertical" android:layout_margin="4dip" android:text="Static Text" > </TextView> </LinearLayout> 

现在上课。

 public class MyWidgetProvider extends AppWidgetProvider { private static final String ACTION_CLICK = "ACTION_CLICK"; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // Get all ids ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); for (int widgetId : allWidgetIds) { // Create some random data int number = (new Random().nextInt(100)); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); Log.w("WidgetExample", String.valueOf(number)); // Set the text remoteViews.setTextViewText(R.id.update, String.valueOf(number)); // Register an onClickListener Intent intent = new Intent(context, MyWidgetProvider.class); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent); appWidgetManager.updateAppWidget(widgetId, remoteViews); } } 

我find几天我得到解决scheme。 所以我分享我的想法。

这个网站对我来说非常有用。

http://kasperholtze.com/android/how-to-make-a-simple-android-widget/

我做了一些改变,做了我的工作。

需求解决scheme:

1.使接收者,并像这样明确的许可。

 <receiver android:name=".WatchWidget" android:label="WatchWidget" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/watch_widget_provider" /> </receiver> 

2.在我的身边需要顶级的TextView点击,所以可以在onUpdate()使用TextView id。

  remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_lay); Intent intent = new Intent(context, TestActivity.class); intent.setAction("callActivity"); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); remoteViews.setOnClickPendingIntent(R.id.widget_textview, pendingIntent); appWidgetManager.updateAppWidget(new ComponentName(context,WatchWidget.class), remoteViews); 

我想调用数据库并获取logging并显示它。 现在问题是什么更新?

所以我使用了定时器类,每1000秒运行一次,因为以上的部件总是会更新30分钟(可能会)。

 @Override public void onUpdate( final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds ) { this.appWidgetManager = appWidgetManager; try { Timer timer = new Timer(); timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager,appWidgetIds), 1, 1000); } catch (Exception e) { System.out.println("Exception:"); } updateSwitch1(context, appWidgetManager, appWidgetIds[0]); } 

如果有任何疑问,然后发表评论,并感谢所有谁给了我全力支持,使这个答案有用。