桌面组件Appwidget的应用实例以及导入第三方jar包的问题处理
发布时间:2021-12-15 10:59:02 所属栏目:教程 来源:互联网
导读:打开eclipse发现自己昨天做的天气预报有错,很诡异,在eclipse的工程前面有一个小错号,但是却没有报什么地方有错,于是,自己用傻类吧唧的重新再建一个工程,重新导入第三方的jar包sax2r2.jar的包,注意就是这个包的路径出现了错误,由于我把sax2r2.jar放在
打开eclipse发现自己昨天做的天气预报有错,很诡异,在eclipse的工程前面有一个小错号,但是却没有报什么地方有错,于是,自己用傻类吧唧的重新再建一个工程,重新导入第三方的jar包sax2r2.jar的包,注意就是这个包的路径出现了错误,由于我把sax2r2.jar放在桌面上,用完感觉到没什么用后就直接删了,然后重启一下eclipse后就发现了工程前面有错好,当时那个纠结加郁闷,于是上网上搜索了一下,再加上学长的提示,终于把这个问题解决了, 解决步骤如下: 首先,以后 在导入jar包的时候最好把jar包放入到自己建的工程里,这样当再次使用的时候,自己导入的jar包就不会因为丢失而郁闷路径path的问题了, 其次,如果不小心把jar包给删了,解决的方法如下:在自己的工程右键选择properties---Java Build Path ----Libraries----sax2r2.jar(选中导入的jar包)会出现错号,或者显示jar包miss丢失,如果出现这种情况,直接选中,然后Remove,然后再重新导入一下jar包(注意这次不要把它在从电脑中误删喽!!!), 导入jar步骤如下:在自己的工程右键选择properties---Java Build Path ----Libraries----Add External JARS--选择电脑中的jar包---然后同一个界面下的Order and Export 在自己导入的jar包前勾选,然后点击OK就可以了 2,今天解决的第二个问题,在多个Xml文件进行布局调用多个Activity时候,由于导包错误,导致自己定义布局的mapview.XML找不到layout,既setContentView(R.layout.mapview);找不到在R.java文件中注册的id,解决方法是直接删除 import Android.R;从新导入自己包中的R.这样问题就可以解决了。 3.今天学习的内容是app widget 其中两个重要的东西, AppWidgetProviderInfo对象 为App widget提供元数据(布局、更新频率等等) AppWidgetProvider定义App Widget的基本生命周期函数 PendingIntent 类似锦囊的意思 创建方法有:1、getActivity(Context context,int requestCode,Intent intent ,int flags) 2、getBroadcast(Context context,int requestCode,Intent intent ,int flags) 3、getService(Context context,int requestCode,Intent intent ,int flags) RemoteViews 表示一系列的View对象 表示对象运行在另外一个进程当中 4.注意AppWidget和主程序不在同一个进程当中,不能用普通的方法进行操作,但可以用一下方法,比如:RemoteView是中的一些方法, 好了废话不多说了,看看今天要实现的桌面组件AppWidget的过程 1.首先先看布局 一个简单的文本,图片、和按钮 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/app" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暑假第二十天下午好!!!" android:textColor="#FF6130" /> <ImageView android:id="@+id/image" android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/a" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试widget" /> </LinearLayout> 2.想要实现桌面组件,还需要在res的目录下建一个文件夹,里面包含一个XML文件,内容如下 <?xml version="1.0" encoding="UTF-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minHeight="80dp" android:minWidth="300dp" android:updatePeriodMillis="30000" android:initialLayout="@layout/appwidget"> </appwidget-provider> 3.看看主活动里面的内容: package com.wang.provider; import com.wang.R; 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.widget.RemoteViews; public class Appwidgetprovider extends AppWidgetProvider { // 常量字符串用于命名Action private static final String UPDATE_ACTION = "wang.UPDATE_APP_WIDGET"; //调用自身的方法 public void onDeleted(Context context, int[] appWidgetIds) { } @Override public void onDisabled(Context context) { } @Override public void onEnabled(Context context) { } @Override public void onReceive(Context context, Intent intent) { // 获取当前的意图动作 String action = intent.getAction(); if (UPDATE_ACTION.equals(action)) { //描述了一个视图层次结构,可以显示在另一个进程 //创建一个新的RemoteViews对象将显示视图包含在指定的布局文件。 RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.appwidget); //设置图片资源 remoteViews.setImageViewResource(R.id.image, R.drawable.b); //设置文本内容 remoteViews.setTextViewText(R.id.app, "今天都学到了什么???"); //获取AppWidgetManager实例用于提供的上下文对象 AppWidgetManager appWidgetManager = AppWidgetManager .getInstance(context); /*****ComponentName为一个特定的应用程序组件的标识符(活动、服务, * 或ContentProvider BroadcastReceiver)可用。 * 两条信息,封装在这里,都必须确定一个组件:这个包(一个字符串), * 它存在于,类(一个字符串)的名字里面的包 ***/ ComponentName componentName = new ComponentName(context, AppWidgetProvider.class); /***设置RemoteViews用于所有实例AppWidget为所提供AppWidget提供者。 * 调用这个方法既在一个ACTION_APPWIDGET_UPDATE广播、内外的处理程序。 * 这种方法只会工作,当调用从uid,拥有AppWidget提供者。更新appwidget**/ appWidgetManager.updateAppWidget(componentName, remoteViews); } else { //实现接受上下文的的方法和意图 super.onReceive(context, intent); } } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // for (int i = 0; i < appWidgetIds.length; i++) { // // System.out.println(appWidgetIds[i]); // //创建一个intent的对象 // Intent intent =new Intent(context,Target.class); // //创建一个pendingitent对象 // PendingIntent pendingIntent=PendingIntent.getActivity(context, 0, // intent, 0); // RemoteViews remoteViews=new // RemoteViews(context.getPackageName(),R.layout.appwidget); // //为按钮绑定事件处理器 // //,第一个参数用来指定被绑定的处理器的的ID // //第二个参数是用来指定当事件发生时候,哪一个pendingintent会被执行 // remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent); // ///g更新Appwidget // appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews); // } Intent intent = new Intent(); // 为intent对象设置Action intent.setAction(UPDATE_ACTION); // 使用getBroadcast方法得到一个对象,当该对象执行时候,将发送一个广播 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); //声明一个RemoteViews的对象 RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.appwidget); //设置点击事件 remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent); // /g更新Appwidget appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); } } 4.亲、今天不是添加的权限,但是也是不能忘记添加的receiver <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wang" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".AppWidgetTestActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="Appwidgetprovider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <intent-filter> <action android:name="wang.UPDATE_APP_WIDGET" /> </intent-filter> <!-- 元数据 --> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidgettest" /> </receiver> </application> </manifest> 5.运行结果如下:首先长按桌面--->窗口小部件----->appwidgetTest---->结果,点击按钮切换图片和文本 ![]() (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |