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

Android中widget編寫注意事項:程序成功執行Done卻沒有widget

大家都知道Android中的widget是個很有愛的東東啦~所以使用這個東東的people也一定很多!當然在使用過程中也就會出現不少“不正常”的地方喽~

不急,先來個實例代碼,題中所述的問題的解決辦法在實例後面再說哈~

首先,是Manifest文件

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.test.widget"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <uses-sdk android:minSdkVersion="8" />  
  7.   
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  9.   
  10.         <receiver android:label="Hello,App Widget" android:name=".HelloWidgetProvider">  
  11.             <intent-filter>  
  12.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>  
  13.             </intent-filter>  
  14.               
  15.             <meta-data android:name="android.appwidget.provider" android:resource="@xml/provider_info" />  
  16.         </receiver>  
  17.   
  18.     </application>  
  19. </manifest>  

然後,是layout下的main.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:background="@drawable/p1">  
  7.       
  8.     <TextView    
  9.         android:id="@+id/textview"  
  10.         android:layout_width="fill_parent"   
  11.         android:layout_height="wrap_content"   
  12.         android:text="@string/hello"  
  13.         android:textSize="10px"  
  14.         android:textColor="#ff0000"/>  
  15. </LinearLayout>
再然後,在res目錄下新建一個xml文件夾,在此文件夾中新建一個provider_info.xml文件
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:minWidth="50dip"  
  4.     android:minHeight="50dip"  
  5.     android:updatePeriodMillis="10000"  
  6.     android:initialLayout="@layout/main"/>
最後最後,主角——java代碼WidgetActivity.java
  1. import android.appwidget.AppWidgetManager;   
  2. import android.appwidget.AppWidgetProvider;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. import android.util.Log;  
  6. //AppWidgetProvider 是 BroadcastReceiver 的子類,本質是個 廣播接收器,它專門用來接收來 自Widget組件的各種請求(用Intent傳遞過來),所以如果讓我給他起名的話 我會給他命名為AppWidgetReceiver,每一個Widget都要有一個AppWidgetProvider.   
  7. public class WidgetActivity extends AppWidgetProvider {  
  8. //每個請求都會傳遞給onReceive方法,該方法根據Intent參數中的action類型來決定自己處理還是分發給下面四個特殊的方法。   
  9.     @Override  
  10.     public void onReceive(Context context, Intent intent) {  
  11. Log.i("yao""HelloWidgetProvider --> onReceive");  
  12.         super.onReceive(context, intent);  
  13.     }  
  14. //如果Widget自動更新時間到了、或者其他會導致Widget發生變化的事件發生,或者說Intent的值是android.appwidget.action.APPWIDGET_UPDATE,那麼會調用onUpdate,下面三個方法類似   
  15.     @Override  
  16.     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {  
  17. //AppWidgetManager 顧名思義是AppWidget的管理器,appWidgetIds 桌面上所有的widget都會被分配一個唯一的ID標識,那麼這個數組就是他們的列表   
  18.         Log.i("yao""HelloWidgetProvider --> onUpdate");  
  19.         super.onUpdate(context, appWidgetManager, appWidgetIds);  
  20.     }  
  21. //當一個App Widget從桌面上刪除時調用   
  22.     @Override  
  23.     public void onDeleted(Context context, int[] appWidgetIds) {  
  24.         Log.i("yao""HelloWidgetProvider --> onDeleted");  
  25.         super.onDeleted(context, appWidgetIds);  
  26.     }  
  27. //當這個App Widget第一次被放在桌面上時調用(同一個App Widget可以被放在桌面上多次,所以會有這個說法)   
  28.     @Override  
  29.     public void onEnabled(Context context) {  
  30.         Log.i("yao""HelloWidgetProvider --> onEnabled");  
  31.         super.onEnabled(context);  
  32.     }  
  33. //當這個App Widget的最後一個實例被從桌面上移除時會調用該方法。   
  34.     @Override  
  35.     public void onDisabled(Context context) {  
  36.         Log.i("yao""HelloWidgetProvider --> onDisabled");  
  37.         super.onDisabled(context);  
  38.     }
OK,以上就是整個widget的小工程啦,當然這個只是實現基本的功能,並沒有添加額外的什麼哈~

回到題中說到的異常哈,其實這個問題在編譯時一點問題都沒有的,大家也看到啦,工程中並沒有什麼紅色的叉叉的,而且運行的Log也提示運行成功,那到底為什麼就找不到我們創建的widget呢?

其實很簡單啦,關鍵就只是Manifest文件中的那個元數據!!!對,就是那個meta-data啦,以前的工程中可能會寫成META-data,這樣看沒啥錯的,但是運行出來的結果就是沒有我們要的widget哈,這邊只要把大寫都改成小寫,也就是寫成meta-data就OK啦~~~大家再試試看看吧,出來了吧^_^         O(∩_∩)O哈哈~

Copyright © Linux教程網 All Rights Reserved