桌面组件Appwidget的应用实例以及导入第三方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.首先先看布局 一个简单的文本,图片、和按钮

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/app"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="暑假第二十天下午好!!!"   
  12.         android:textColor="#FF6130"  
  13.         />  
  14.   
  15.     <ImageView  
  16.         android:id="@+id/image"  
  17.         android:layout_width="40dp"  
  18.         android:layout_height="40dp"  
  19.         android:src="@drawable/a" />  
  20.   
  21.     <Button  
  22.         android:id="@+id/button"  
  23.         android:layout_width="wrap_content"  
  24.         android:layout_height="wrap_content"  
  25.         android:text="测试widget" />  
  26.   
  27. </LinearLayout>  
2.想要实现桌面组件,还需要在res的目录下建一个文件夹,里面包含一个XML文件,内容如下
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
  3. android:minHeight="80dp"  
  4. android:minWidth="300dp"  
  5. android:updatePeriodMillis="30000"  
  6. android:initialLayout="@layout/appwidget">  
  7.   
  8. </appwidget-provider>  
3.看看主活动里面的内容:
  1. package com.wang.provider;  
  2.   
  3. import com.wang.R;  
  4.   
  5. import android.app.PendingIntent;  
  6. import android.appwidget.AppWidgetManager;  
  7. import android.appwidget.AppWidgetProvider;  
  8. import android.content.ComponentName;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.widget.RemoteViews;  
  12.   
  13. public class Appwidgetprovider extends AppWidgetProvider {  
  14.     // 常量字符串用于命名Action   
  15.     private static final String UPDATE_ACTION = "wang.UPDATE_APP_WIDGET";  
  16.       
  17.     //调用自身的方法   
  18.     public void onDeleted(Context context, int[] appWidgetIds) {  
  19.     }  
  20.   
  21.     @Override  
  22.     public void onDisabled(Context context) {  
  23.     }  
  24.   
  25.     @Override  
  26.     public void onEnabled(Context context) {  
  27.     }  
  28.   
  29.     @Override  
  30.     public void onReceive(Context context, Intent intent) {  
  31.          // 获取当前的意图动作   
  32.         String action = intent.getAction();  
  33.           
  34.         if (UPDATE_ACTION.equals(action)) {  
  35.            //描述了一个视图层次结构,可以显示在另一个进程   
  36.             //创建一个新的RemoteViews对象将显示视图包含在指定的布局文件。   
  37.             RemoteViews remoteViews = new RemoteViews(context.getPackageName(),  
  38.                     R.layout.appwidget);  
  39.             //设置图片资源   
  40.             remoteViews.setImageViewResource(R.id.image, R.drawable.b);  
  41.             //设置文本内容   
  42.             remoteViews.setTextViewText(R.id.app, "今天都学到了什么???");  
  43.             //获取AppWidgetManager实例用于提供的上下文对象   
  44.             AppWidgetManager appWidgetManager = AppWidgetManager  
  45.                     .getInstance(context);  
  46.             /*****ComponentName为一个特定的应用程序组件的标识符(活动、服务, 
  47.              * 或ContentProvider BroadcastReceiver)可用。 
  48.              * 两条信息,封装在这里,都必须确定一个组件:这个包(一个字符串), 
  49.              *  它存在于,类(一个字符串)的名字里面的包 
  50.             ***/  
  51.             ComponentName componentName = new ComponentName(context,  
  52.                     AppWidgetProvider.class);  
  53.             /***设置RemoteViews用于所有实例AppWidget为所提供AppWidget提供者。   
  54.              * 调用这个方法既在一个ACTION_APPWIDGET_UPDATE广播、内外的处理程序。 
  55.              * 这种方法只会工作,当调用从uid,拥有AppWidget提供者。更新appwidget**/  
  56.             appWidgetManager.updateAppWidget(componentName, remoteViews);  
  57.   
  58.         } else {  
  59.             //实现接受上下文的的方法和意图   
  60.             super.onReceive(context, intent);  
  61.   
  62.         }  
  63.   
  64.     }  
  65.   
  66.     @Override  
  67.     public void onUpdate(Context context, AppWidgetManager appWidgetManager,  
  68.             int[] appWidgetIds) {  
  69.         // for (int i = 0; i < appWidgetIds.length; i++) {   
  70.         //             
  71.         // System.out.println(appWidgetIds[i]);   
  72.         // //创建一个intent的对象   
  73.         // Intent intent =new Intent(context,Target.class);   
  74.         // //创建一个pendingitent对象   
  75.         // PendingIntent pendingIntent=PendingIntent.getActivity(context, 0,   
  76.         // intent, 0);   
  77.         // RemoteViews remoteViews=new   
  78.         // RemoteViews(context.getPackageName(),R.layout.appwidget);   
  79.         // //为按钮绑定事件处理器   
  80.         // //,第一个参数用来指定被绑定的处理器的的ID   
  81.         // //第二个参数是用来指定当事件发生时候,哪一个pendingintent会被执行   
  82.         // remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);   
  83.         // ///g更新Appwidget   
  84.         // appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);   
  85.         // }   
  86.   
  87.         Intent intent = new Intent();  
  88.         // 为intent对象设置Action   
  89.         intent.setAction(UPDATE_ACTION);  
  90.         // 使用getBroadcast方法得到一个对象,当该对象执行时候,将发送一个广播   
  91.         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,  
  92.                 intent, 0);  
  93.         //声明一个RemoteViews的对象   
  94.         RemoteViews remoteViews = new RemoteViews(context.getPackageName(),  
  95.                 R.layout.appwidget);  
  96.         //设置点击事件   
  97.         remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);  
  98.         // /g更新Appwidget   
  99.         appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);  
  100.     }  
  101.   
  102. }  
4.亲、今天不是添加的权限,但是也是不能忘记添加的receiver
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.wang"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="10" />  
  8.   
  9.     <application  
  10.         android:icon="@drawable/ic_launcher"  
  11.         android:label="@string/app_name" >  
  12.         <activity  
  13.             android:name=".AppWidgetTestActivity"  
  14.             android:label="@string/app_name" >  
  15.             <intent-filter>  
  16.                 <action android:name="android.intent.action.MAIN" />  
  17.   
  18.                 <category android:name="android.intent.category.LAUNCHER" />  
  19.             </intent-filter>  
  20.         </activity>  
  21.   
  22.         <receiver android:name="Appwidgetprovider" >  
  23.               
  24.             <intent-filter>  
  25.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />  
  26.             </intent-filter>  
  27.               
  28.             <intent-filter>  
  29.                 <action android:name="wang.UPDATE_APP_WIDGET" />  
  30.             </intent-filter>  
  31.             <!-- 元数据 -->  
  32.             <meta-data  
  33.                 android:name="android.appwidget.provider"  
  34.                 android:resource="@xml/appwidgettest" />  
  35.         </receiver>  
  36.     </application>  
  37.   
  38. </manifest>  
5.运行结果如下:首先长按桌面--->窗口小部件----->appwidgetTest---->结果,点击按钮切换图片和文本



相关内容

    暂无相关文章