日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

android widget包说明与应用

發(fā)布時間:2023/12/14 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android widget包说明与应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

widget包是存放自定義組件

開發(fā)自定義組件;

其實(shí)Android API開發(fā)指南中的App Widgets章節(jié) 已經(jīng)說得很清楚了,下面只是對自己的理解進(jìn)行一次梳理。?

--?
AppWidget 就是HomeScreen上顯示的小部件,提供直觀的交互操作。通過在HomeScreen中長按,在彈出的對話框中選擇Widget部件來進(jìn)行創(chuàng)建,長按部件后并拖動到垃圾箱里進(jìn)行刪除。同一個Widget部件可以同時創(chuàng)建多個。?

AppWidget的實(shí)現(xiàn)主要涉及到以下類:?
AppWidgetProvider?
RemoteViews?
AppWidgetManager?

1.?
首先需要提供一個定義了Widget界面布局的XML文件(位于res/layout/..),需要注意的是使用的組件必須是RemoteViews所支持的,目前原生API中支持的組件如下:?
FrameLayout?
LinearLayout?
RelativeLayout?

AnalogClock?
Button?
Chronmeter?
ImageButton?
ImageView?
ProgressBar?
TextView?

*如果使用了除此之外的組件,則在Widget創(chuàng)建時會導(dǎo)致android.view.InflateExceptionn異常。?

PS:這就導(dǎo)致有一些功能或樣式無法實(shí)現(xiàn),如很基本的list或文本編輯框都是無法直接實(shí)現(xiàn)的。如果想自定義Widget中的View的話只能通過修改framework來提供相應(yīng)組件的支持。?

2.?
然后需要提供一個xml文件來定義Widget的基本屬性,放置到res/xml/..目錄下。?
如果使用的是Eclipse可按如下操作:?
1) 在res/目錄下創(chuàng)建xml/目錄?
2)創(chuàng)建xml文件(名字可任意),選擇類型為AppWidgetProvider?
3)在彈出的便捷界面進(jìn)行參數(shù)設(shè)置?

主要設(shè)置的參數(shù)如下:?
minWidth: 定義Wdiget組件的寬度?
minHeight: 定義Wdiget組件的高度?
updatePeriodMillis: 更新的時間周期?
initialLayout: Widget的布局文件?
configure: 如果需要在啟動前先啟動一個Activity進(jìn)行設(shè)置,在這里給出Activity的完整類名(后面會說到,與一般Activity的實(shí)現(xiàn)有些許差別)?

*Widget大小的計算單元格數(shù)*74)-2,API上說是為了防止像素計算時的整數(shù)舍入導(dǎo)致錯所以-2...不是很明白?

一個完整的樣例:?
Xml代碼? 收藏代碼?

??? <?xml version="1.0" encoding="utf-8"?>??
??? <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"??
????????? android:minWidth="80dp"??
????????? android:minHeight="32dp"??
????????? android:updatePeriodMillis="86400000"??
????????? android:initialLayout="@layout/widget_provider"??
????????? android:configure="com.demo.widget.MyWidgetConfiguration" >??
??? </appwidget-provider>??



3.?
xml都定義好后,接下來就是創(chuàng)建一個繼承自AppWidgetProvider的子類,AppWidgetProvider實(shí)際上就是一個BroadcastReceiver,里面提供了以下函數(shù):?
onReceive(Context, Intent)?
onUpdate(Context , AppWidgetManager, int[] appWidgetIds)?
onEnabled(Context)?
onDeleted(Context, int[] appWidgetIds)?
onDisabled(Context)?
可通過重寫以上函數(shù)來監(jiān)聽Widget狀態(tài)的變化并進(jìn)行相應(yīng)的處理。?

以上函數(shù)具體調(diào)用情況歸納如下:?
[啟動 - 無confiure Activity]?
onReceive?
onEnabled —— 第一個widget被顯示?
onReceive?
onUpdate —— 刷新界面?

[啟動 - 帶confiuration Activity]?
onReceive?
onUpdate?

[拖動]?
<無狀態(tài)變化>?

[周期更新]?
onReceive?
onUpdate?

[刪除]?
onReceive?
onDeleted —— widget被刪除?
onReceive?
onDisabled —— 最后一個widget被移除?

[啟動時位置不夠]?
onReceive?
onEnabled?
onReceive?
onUpdate?
onReceive?
onDeleted?
onReceive?
onDisabled?

*每次狀態(tài)的變化會觸發(fā)onReceive,一般該函數(shù)是不需要重寫的。?

簡單了解AppWidgetProvider之后,我們來看具體實(shí)現(xiàn)。?
這里創(chuàng)建一個MyAppWidgetProvider繼承AppWidgetProvider:?
Java代碼? 收藏代碼?

??? public class MyWidgetProvider extends AppWidgetProvider {??
??????
????????? static final String TAG = "widget";??
???????????
????????? /**?
?????????? * 更新?
?????????? */??
????????? public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){??
??????????????? Log.i(TAG, "onUpdate");??
????????? }??
???????????
????????? /**?
?????????? * 第一個Widget組件啟動時觸發(fā)?
?????????? */??
????????? public void onEnabled(Context context){??
??????????????? Log.i(TAG, "onEnabled");??
????????? }??
???????????
????????? /**?
?????????? * 最后一個Widget組件關(guān)閉時觸發(fā)?
?????????? */??
????????? public void onDisabled(Context context){??
??????????????? Log.i(TAG, "onDisabled");??
????????? }??
???????????
????????? /**?
?????????? * 任一Widget組件被刪除時觸發(fā)?
?????????? */??
????????? public void onDeleted(Context context, int[] appWidgetIds){??
??????????????? Log.i(TAG, "onDeleted");??
????????? }??
???????????
????????? /**?
?????????? * 以上函數(shù)觸發(fā)前會先觸發(fā)該函數(shù),一般不需要重寫?
?????????? */??
????????? public void onReceive(Context context, Intent intent){??
??????????????? Log.i(TAG, "onReceive");??
??????????????? super.onReceive(context, intent);??
????????? }??
???????????
??? }??



其中onUpdate顧名思義是對Widget進(jìn)行更新的,前面定義的更新周期就是作用于該函數(shù)的。?
Widget的更新與Activity不同,必須借助于RemoteViews和AppWidgetMananger。具體實(shí)現(xiàn)如下:?
Java代碼? 收藏代碼?

??? public void onUpdate(Context context, AppWidgetMananger appWidgetManager, int[] appWidgetIds){??
??????? int N = appWidgetIds.length; // 可能啟動了多個Widget,appWidgetIds記錄了這些Widget的ID??
??????? for(int i=0; i<N; i++){??
??????????? RemoteViews? views = new RemoteViews(getPackageName(), R.layout.widget_views);??
??????????? appWidgetManager.updateAppWidget(appWidgetIds[i], views);??
??????? }??
??? }??


其中需要注意的是,雖然RemoteViews參數(shù)都是一樣的,但是對于每個Widget最好都新創(chuàng)建一個再進(jìn)行傳遞,否則會導(dǎo)致一些錯誤。具體可參考AppWidget RemoteViews 內(nèi)存溢出 。?

其他函數(shù)的可以根據(jù)需要實(shí)現(xiàn)。?

由于無法獲取到RemoteViews創(chuàng)建的界面中的元素,對于Widget中組件的操作只能通過RemoteViews所提供的有限的函數(shù)進(jìn)行,常用的有:?
setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)?
setProgressBar(int viewId, int max, int progress, boolean indeterminate)?
setTextViewText(int viewId, CharSequence text)?
setViewVisibility(int viewId, int visibility)?
詳細(xì)函數(shù)列表可參考API中的RemoteViews類 。?

4.?
最后,更新AndroidManifest.xml。?
AppWidgetProvider對應(yīng)一個receiver屬性:?
Xml代碼? 收藏代碼?

??? <receiver android:name="MyWidgetProvider">??
??????????????? <intent-filter>??
??????????????????? <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>??
??????????????? </intent-filter>??
??????????????? <meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"></meta-data>??
??????????? </receiver>??



5.?
提供Configuration Activity?
Configuration Activity是一個在Widget啟動前先啟動的Activity,方便用戶對Widget的屬性進(jìn)行設(shè)置。?

在res/xml/...下對應(yīng)的"屬性文件"中添加configure字段指定啟動的Activity,并在AndroidManifest.xml中該Activity下提供一個action為android.appwidget.action.APPWIDGET_CONFIGURE 的IntenFilter。?

需要注意的是,?
如果設(shè)置了Configure屬性,則必須在指定的Activity中進(jìn)行如下處理:?
1.在onCreate中setContentView()函數(shù)前添加setResult(RESULT_CANCLE) ,這樣如果在Activity初始化完成前按下了BACK按鍵,則Widget不會啟動;?
2.在setContentView()函數(shù)之后(不一定要在onCreate中,在Activity退出前即可),添加如下設(shè)置以指定需要啟動的Widget:?
Java代碼? 收藏代碼?

??? int mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);??
??? Intent resultValue = new Intent();??
??? resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);??
??? setResult(RESULT_OK, resultValue);??

否則會導(dǎo)致退出Activity后Widget不啟動。?

>> Widget創(chuàng)建步驟匯總:?
1.定義Widget布局XML -> res/layout/...?
2.定義Widget屬性文件(xml) -> res/xml/...?
3. 創(chuàng)建AppWidgetProider子類,實(shí)現(xiàn)onUpdate()等函數(shù),在manifest中注冊receiver,添加一個action為 android.appwidget.action.APPWIDGET_UPDATE 的IntentFilter,并添加如下<meta- data>標(biāo)識:?
Xml代碼? 收藏代碼?

??? <meta-data android:resource="@xml/<屬性文件xml>" android:name="android.appwidget.provider"></meta-data>??



4. 創(chuàng)建Coniguration Activity(注意處理好setResult),添加到屬性文件中的Configure屬性,在manifest中注冊activity,添加一個 action為android.appwidget.action.APPWIDGET_CONFIGURE 的IntentFilter?

最后附上一個完整的例子,?
實(shí)現(xiàn)思路如下:?
1. 提供一個Configuration Activity,這里只簡單顯示一行文字;?
2.退出后Widget啟動;?
3.點(diǎn)擊Widget中的按鈕會啟動一個Activity

(轉(zhuǎn)自:http://quding0308.iteye.com/blog/1164276)

轉(zhuǎn)載于:https://www.cnblogs.com/jenson138/p/4347206.html

總結(jié)

以上是生活随笔為你收集整理的android widget包说明与应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。