歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android中widget編寫注意事項:程序成功執行Done卻沒有widget

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

日期:2017/3/1 11:09:28   编辑:Linux編程

大家都知道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. <application android:icon="@drawable/icon" android:label="@string/app_name">
  8. <receiver android:label="Hello,App Widget" android:name=".HelloWidgetProvider">
  9. <intent-filter>
  10. <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
  11. </intent-filter>
  12. <meta-data android:name="android.appwidget.provider" android:resource="@xml/provider_info" />
  13. </receiver>
  14. </application>
  15. </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. <TextView
  8. android:id="@+id/textview"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/hello"
  12. android:textSize="10px"
  13. android:textColor="#ff0000"/>
  14. </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