歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 桌面組件Appwidget的應用實例以及導入第三方jar包的問題解決

桌面組件Appwidget的應用實例以及導入第三方jar包的問題解決

日期:2017/3/1 10:14:06   编辑:Linux編程

打開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. <TextView
  7. android:id="@+id/app"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:text="暑假第二十天下午好!!!"
  11. android:textColor="#FF6130"
  12. />
  13. <ImageView
  14. android:id="@+id/image"
  15. android:layout_width="40dp"
  16. android:layout_height="40dp"
  17. android:src="@drawable/a" />
  18. <Button
  19. android:id="@+id/button"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:text="測試widget" />
  23. </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. </appwidget-provider>
3.看看主活動裡面的內容:
  1. package com.wang.provider;
  2. import com.wang.R;
  3. import android.app.PendingIntent;
  4. import android.appwidget.AppWidgetManager;
  5. import android.appwidget.AppWidgetProvider;
  6. import android.content.ComponentName;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.widget.RemoteViews;
  10. public class Appwidgetprovider extends AppWidgetProvider {
  11. // 常量字符串用於命名Action
  12. private static final String UPDATE_ACTION = "wang.UPDATE_APP_WIDGET";
  13. //調用自身的方法
  14. public void onDeleted(Context context, int[] appWidgetIds) {
  15. }
  16. @Override
  17. public void onDisabled(Context context) {
  18. }
  19. @Override
  20. public void onEnabled(Context context) {
  21. }
  22. @Override
  23. public void onReceive(Context context, Intent intent) {
  24. // 獲取當前的意圖動作
  25. String action = intent.getAction();
  26. if (UPDATE_ACTION.equals(action)) {
  27. //描述了一個視圖層次結構,可以顯示在另一個進程
  28. //創建一個新的RemoteViews對象將顯示視圖包含在指定的布局文件。
  29. RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
  30. R.layout.appwidget);
  31. //設置圖片資源
  32. remoteViews.setImageViewResource(R.id.image, R.drawable.b);
  33. //設置文本內容
  34. remoteViews.setTextViewText(R.id.app, "今天都學到了什麼???");
  35. //獲取AppWidgetManager實例用於提供的上下文對象
  36. AppWidgetManager appWidgetManager = AppWidgetManager
  37. .getInstance(context);
  38. /*****ComponentName為一個特定的應用程序組件的標識符(活動、服務,
  39. * 或ContentProvider BroadcastReceiver)可用。
  40. * 兩條信息,封裝在這裡,都必須確定一個組件:這個包(一個字符串),
  41. * 它存在於,類(一個字符串)的名字裡面的包
  42. ***/
  43. ComponentName componentName = new ComponentName(context,
  44. AppWidgetProvider.class);
  45. /***設置RemoteViews用於所有實例AppWidget為所提供AppWidget提供者。  
  46. * 調用這個方法既在一個ACTION_APPWIDGET_UPDATE廣播、內外的處理程序。
  47. * 這種方法只會工作,當調用從uid,擁有AppWidget提供者。更新appwidget**/
  48. appWidgetManager.updateAppWidget(componentName, remoteViews);
  49. } else {
  50. //實現接受上下文的的方法和意圖
  51. super.onReceive(context, intent);
  52. }
  53. }
  54. @Override
  55. public void onUpdate(Context context, AppWidgetManager appWidgetManager,
  56. int[] appWidgetIds) {
  57. // for (int i = 0; i < appWidgetIds.length; i++) {
  58. //
  59. // System.out.println(appWidgetIds[i]);
  60. // //創建一個intent的對象
  61. // Intent intent =new Intent(context,Target.class);
  62. // //創建一個pendingitent對象
  63. // PendingIntent pendingIntent=PendingIntent.getActivity(context, 0,
  64. // intent, 0);
  65. // RemoteViews remoteViews=new
  66. // RemoteViews(context.getPackageName(),R.layout.appwidget);
  67. // //為按鈕綁定事件處理器
  68. // //,第一個參數用來指定被綁定的處理器的的ID
  69. // //第二個參數是用來指定當事件發生時候,哪一個pendingintent會被執行
  70. // remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);
  71. // ///g更新Appwidget
  72. // appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
  73. // }
  74. Intent intent = new Intent();
  75. // 為intent對象設置Action
  76. intent.setAction(UPDATE_ACTION);
  77. // 使用getBroadcast方法得到一個對象,當該對象執行時候,將發送一個廣播
  78. PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
  79. intent, 0);
  80. //聲明一個RemoteViews的對象
  81. RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
  82. R.layout.appwidget);
  83. //設置點擊事件
  84. remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);
  85. // /g更新Appwidget
  86. appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
  87. }
  88. }
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. <uses-sdk android:minSdkVersion="10" />
  7. <application
  8. android:icon="@drawable/ic_launcher"
  9. android:label="@string/app_name" >
  10. <activity
  11. android:name=".AppWidgetTestActivity"
  12. android:label="@string/app_name" >
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. </activity>
  18. <receiver android:name="Appwidgetprovider" >
  19. <intent-filter>
  20. <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  21. </intent-filter>
  22. <intent-filter>
  23. <action android:name="wang.UPDATE_APP_WIDGET" />
  24. </intent-filter>
  25. <!-- 元數據 -->
  26. <meta-data
  27. android:name="android.appwidget.provider"
  28. android:resource="@xml/appwidgettest" />
  29. </receiver>
  30. </application>
  31. </manifest>
5.運行結果如下:首先長按桌面--->窗口小部件----->appwidgetTest---->結果,點擊按鈕切換圖片和文本



Copyright © Linux教程網 All Rights Reserved