大家都知道Android中的widget是個很有愛的東東啦~所以使用這個東東的people也一定很多!當然在使用過程中也就會出現不少“不正常”的地方喽~
不急,先來個實例代碼,題中所述的問題的解決辦法在實例後面再說哈~
首先,是Manifest文件
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.test.widget"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk android:minSdkVersion="8" />
-
- <application android:icon="@drawable/icon" android:label="@string/app_name">
-
- <receiver android:label="Hello,App Widget" android:name=".HelloWidgetProvider">
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
- </intent-filter>
-
- <meta-data android:name="android.appwidget.provider" android:resource="@xml/provider_info" />
- </receiver>
-
- </application>
- </manifest>
然後,是layout下的main.xml文件
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@drawable/p1">
-
- <TextView
- android:id="@+id/textview"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- android:textSize="10px"
- android:textColor="#ff0000"/>
- </LinearLayout>
再然後,在res目錄下新建一個xml文件夾,在此文件夾中新建一個provider_info.xml文件
- <?xml version="1.0" encoding="utf-8"?>
- <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="50dip"
- android:minHeight="50dip"
- android:updatePeriodMillis="10000"
- android:initialLayout="@layout/main"/>
最後最後,主角——java代碼WidgetActivity.java
- import android.appwidget.AppWidgetManager;
- import android.appwidget.AppWidgetProvider;
- import android.content.Context;
- import android.content.Intent;
- import android.util.Log;
- //AppWidgetProvider 是 BroadcastReceiver 的子類,本質是個 廣播接收器,它專門用來接收來 自Widget組件的各種請求(用Intent傳遞過來),所以如果讓我給他起名的話 我會給他命名為AppWidgetReceiver,每一個Widget都要有一個AppWidgetProvider.
- public class WidgetActivity extends AppWidgetProvider {
- //每個請求都會傳遞給onReceive方法,該方法根據Intent參數中的action類型來決定自己處理還是分發給下面四個特殊的方法。
- @Override
- public void onReceive(Context context, Intent intent) {
- Log.i("yao", "HelloWidgetProvider --> onReceive");
- super.onReceive(context, intent);
- }
- //如果Widget自動更新時間到了、或者其他會導致Widget發生變化的事件發生,或者說Intent的值是android.appwidget.action.APPWIDGET_UPDATE,那麼會調用onUpdate,下面三個方法類似
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
- //AppWidgetManager 顧名思義是AppWidget的管理器,appWidgetIds 桌面上所有的widget都會被分配一個唯一的ID標識,那麼這個數組就是他們的列表
- Log.i("yao", "HelloWidgetProvider --> onUpdate");
- super.onUpdate(context, appWidgetManager, appWidgetIds);
- }
- //當一個App Widget從桌面上刪除時調用
- @Override
- public void onDeleted(Context context, int[] appWidgetIds) {
- Log.i("yao", "HelloWidgetProvider --> onDeleted");
- super.onDeleted(context, appWidgetIds);
- }
- //當這個App Widget第一次被放在桌面上時調用(同一個App Widget可以被放在桌面上多次,所以會有這個說法)
- @Override
- public void onEnabled(Context context) {
- Log.i("yao", "HelloWidgetProvider --> onEnabled");
- super.onEnabled(context);
- }
- //當這個App Widget的最後一個實例被從桌面上移除時會調用該方法。
- @Override
- public void onDisabled(Context context) {
- Log.i("yao", "HelloWidgetProvider --> onDisabled");
- super.onDisabled(context);
- }
OK,以上就是整個widget的小工程啦,當然這個只是實現基本的功能,並沒有添加額外的什麼哈~
回到題中說到的異常哈,其實這個問題在編譯時一點問題都沒有的,大家也看到啦,工程中並沒有什麼紅色的叉叉的,而且運行的Log也提示運行成功,那到底為什麼就找不到我們創建的widget呢?
其實很簡單啦,關鍵就只是Manifest文件中的那個元數據!!!對,就是那個meta-data啦,以前的工程中可能會寫成META-data,這樣看沒啥錯的,但是運行出來的結果就是沒有我們要的widget哈,這邊只要把大寫都改成小寫,也就是寫成meta-data就OK啦~~~大家再試試看看吧,出來了吧^_^ O(∩_∩)O哈哈~