如何在单个应用程序中使用应用程序小部件创buildAndroid应用
我已经做了一个Android应用程序 ,其中存储与人名和电话号码的date。
现在我必须为这个应用程序开发一个小部件来显示今天(date,人名和电话号码)与button。
要求:
- 单一的应用程序和小部件。
- 当我点击小部件中的button时,它将启动我的应用程序。
- 小工具的数据应该总是与我的应用程序同步 – 当今天(人5和应用程序添加5个人,然后小部件显示10人数据)
- 我怎样才能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]); }
如果有任何疑问,然后发表评论,并感谢所有谁给了我全力支持,使这个答案有用。