歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

桌面組件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---->結果,點擊按鈕切換圖片和文本



Copyright © Linux教程網 All Rights Reserved