打開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---->結果,點擊按鈕切換圖片和文本