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哈哈~

相关内容