久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Android AppWidget如何支持復雜的View

     shaobin0604@163.com 2010-06-24
    Android AppWidget如何支持復雜的View

    一直想知道如何在AppWidget里面添加 ListView,EditText 這些復雜的View.我們知道要在AppWidget里添加 View都是通過RemoteView來做到了,然而RemoteView本身功能很弱,支持的操作很少,而且支持RemoteView的Widget很 少:
    在Dev Guide中有下面這段:

    A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:

    And the following widget classes:

    Descendants of these classes are not supported.

    所以從這里可以知道,為什么在AppWidget里添加 EditText會顯示LoadError了,因為本身它就不支持這些復雜的 Widget.


    但我們又會有疑問了, 為什么Google Search會有EditText呢?其實這些都是假象,并不是AppWidget支持EditText.

    具體怎么回 事,我猜有兩種情況:

    1.一種確實是EditText但確不是AppWidget 支持的,而是集成到Home里面去了。

    具 體可以參考這里:http://www./archiver/tid-1729.html

    2.最新的SDK 1.6中,顯示在桌面的EditText只是一個ImageView,而這個ImageView的背景就是EditText的截圖了。我們點中這個 “EditText”后,會調起一個Activity,

    而這個Activity就是復雜輸入的EditText,并且會全屏顯示。所以我們 就誤以會那是一個單純的EditText.


    最近看過HTC Hero Sense UI的人都看到了,它的AppWidget是確實支持復雜Widget的,比如:Bookmark Widget:ListView/GridView,Twitter Widget:EditText. 這些確實是我們可以看到的,但它是怎么做到的呢?我也很想知道,AppWidget支持到那么強大,甚至超過了本身AP的功能,很搶眼。但不管是怎么實現 的,我想人家肯定是花了大力氣去做到了,我猜想可能是將Google 提供的AppWidget進行了比較大的改動。我們查看一下framework下的appwidget:

    pjq@gentoo-pjq ~/android/donut $ ls frameworks/base/core/java/android/appwidget/ -lh
    total 60K
    -rw-r--r-- 1 pjq users 7.9K 2009-09-29 21:49 AppWidgetHost.java
    -rw-r--r-- 1 pjq users  12K 2009-09-29 21:49 AppWidgetHostView.java
    -rw-r--r-- 1 pjq users  14K 2009-09-29 21:49 AppWidgetManager.java
    -rw-r--r-- 1 pjq users  691 2009-09-29 21:49 AppWidgetProviderInfo.aidl
    -rw-r--r-- 1 pjq users 5.6K 2009-09-29 21:49 AppWidgetProviderInfo.java
    -rwxr-xr-x 1 pjq users 6.3K 2009-09-29 21:49 AppWidgetProvider.java
    -rw-r--r-- 1 pjq users 1.5K 2009-09-29 21:49 package.html

    可以看 到,appwidget的文件很少,雖然不能說明什么,但按照正常的推理,文件少功能一般也強大不到哪里去,這種想法雖然有些牽強,但暫且就這樣認為吧。

    所 以我想HTC一定是將這里給改動了,以支持復雜的Widget,有知道內情的透露一點最好了。

    要知道RemoteView的功能很少,特別 是對事件處理的能力,都需要通過PendingIntent,傳到BroadcastReceiver去處理。所以這里對一些事件處理也僅限于比較簡單事 件:比如說:Button Clicked,其它的我好像還沒怎么用過,orz....  對復雜的View:比如ListView(當然這里還不支持,打個比方),ListView里面那么多Item,要設置Listener,要傳值,這些 RemoteView都不能像一個單純的Activity那樣處理,呵呵 ,扯遠了,如果能的話,我也就沒有必要這么費勁的寫這篇博客了。


    寫 這篇文章的時候,我已經實現了在 AppWidget里顯示ListView/GridView這些復雜的Widget了,我這里只說顯示,并不是說我已經能讓AppWidget支持 ListView/GridView了。所以我這里更傾向于教你如何在AppWidget里支持顯示ListView/GridView這些復雜的 Widget.


    我們知道AppWidget只支持RemoteView,那哪些Widget是RemoteView 呢,我來教你搜一下:

    pjq@gentoo-pjq ~/android/donut/frameworks/base/core/java/android/widget $ grep -i -n -A 1  @remoteview *.java
    AbsoluteLayout.java:40:@RemoteView
    AbsoluteLayout.java-41-public class AbsoluteLayout extends ViewGroup {
    --
    AnalogClock.java:39:@RemoteView
    AnalogClock.java-40-public class AnalogClock extends View {
    --
    Button.java:58:@RemoteView
    Button.java-59-public class Button extends TextView {
    --
    Chronometer.java:45:@RemoteView
    Chronometer.java-46-public class Chronometer extends TextView {
    --
    FrameLayout.java:47:@RemoteView
    FrameLayout.java-48-public class FrameLayout extends ViewGroup {
    --
    ImageButton.java:66:@RemoteView
    ImageButton.java-67-public class ImageButton extends ImageView {
    --
    ImageView.java:55:@RemoteView
    ImageView.java-56-public class ImageView extends View {現在沒什么問題。
    --
    LinearLayout.java:44:@RemoteView
    LinearLayout.java-45-public class LinearLayout extends ViewGroup {
    --
    ProgressBar.java:122:@RemoteView
    ProgressBar.java-123-public class ProgressBar extends View {
    --
    RelativeLayout.java:66:@RemoteView
    RelativeLayout.java-67-public class RelativeLayout extends ViewGroup {
    --
    TextView.java:186:@RemoteView
    TextView.java-187-public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {

    就是這些了,類名前面加了"@RemoteView",和我 前面列出的那些是不是一樣的呢?--對了,就是這些了,所以以后你想知道你在AppWidget支持哪些Widget就可以像我這樣去搜一下就知道了,這 樣最適時。


    寫到這里我已經將最關鍵的內容都已經寫出來了,還不明白?

    其實簡單點講就是在一個 Widget類前面加上"@RemoteView",加上了它就等于說RemoteView可以支持它, RemoteView支持就等于是AppWidget支持這它了。

    好了,現在你只需要自定義一些你需要的Widget,加 上"@RemoteView"標記,你就可以在AppWidget里使用它了。


    關于如何自定義一個Widget你完 全可以參照frameworks/base/core/java/android/widget已有的這些Widget.依樣加一個。

    其實 如果你需要自定義一個Widget,比如說支持ListView,你可以先在一個activity里實現它,然后將它移到framework下面去。


    這 里說一下可能需要注意的地方:

    1.如果有多個文件,需要Package的時候,名字最好按照這樣的形 式:android.widget.bookmark

    其中bookmark就是你要添加一個Widget存放的地方,這樣的話你就可以在 frameworks/base/core/java/android/widget 目錄下新增bookmark文件夾,將java文件放在這個目錄下。

    如果你新增的Widget只有一個java文件就可以不用這樣了,可以 完全按照已經存在的Widget的樣子,直接將java文件放到frameworks/base/core/java/android/widget目錄 下。


    2.資源文件存放:

    frameworks/base/core/res/res 

    資 源文件都放到這個目錄下。


    3.資源的引用:

    要用這樣的方式引用:com.android.internal.R.drawable.**


    4. 記著在這個Customer Widget類名前加上"@RemoteView"標記.

     

     


     

    這 些都做完了,你就已經將一個自定義的Widget添加到framework了。之后要做的工作就是編譯整個工程了,重新生成SDK。

    最 后你就可以在AppWidget引用你新加的這個Widget了:com.widget.bookmark.***。

    至 此,你已經用上了你新加的這個Widget,并且可以加到AppWidget.

     


    在 新加Widget的時候可能會遇到的一些問題:

    1.構造函數初始化問題。

    如 果在XML里寫的layout不能直接指定哪個構造函數進行初始化,如果你不確定會跑哪個構造函數,最好在每個構造函數里對加上log,這樣你就知道初始 化時會跑哪個構造函數,并將初始化的工作加到里面。我當時就遇到了這個問題,因為用XML寫layout,你不能顯示調用哪個構造函數進行初始化,如果你 將初始化的操作放到一個不會自動跑到的構造函數里面,那面你運行的時候就好像沒添加到Widget一樣。


    2. 其它的再說吧。


    后繼我可能會寫如何添加 Bookmark Widget(支持ListView/GridView,見過HTC Hero Sense UI嗎,就是那個樣子)到AppWidget,敬請期待!

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 无码中文人妻视频2019| 久久丫精品国产亚洲AV不卡| 成人免费看片又大又黄| 婷婷五月综合丁香在线| 亚洲国产日韩一区三区| 无码射肉在线播放视频| 99riav国产精品视频| 国产99青青成人A在线| 55夜色66夜色国产精品视频| 国产午夜福利视频合集| 精品国际久久久久999波多野| 国产女精品视频网站免费蜜芽| 日韩精品亚洲专在线电影| 国产精品视频第一区二区三区| 国产高清一区二区不卡| 免费人成黄页在线观看国产| 好男人官网资源在线观看| 国产午夜福利小视频合集| 精品久久久久久无码国产| 内射一区二区三区四区| 99久久国产综合精品女图图等你| 桃子视频在线播放WWW| 国产在线亚州精品内射| 日本欧美一区二区三区在线播放| 成人免费视频在线观看播放| 日本欧美大码a在线观看| 国产L精品国产亚洲区在线观看 | 成人做受视频试看60秒| 国产AV无区亚洲AV麻豆| 久久先锋男人AV资源网站| 久久777国产线看观看精品| 欧美成人免费做真爱| 亚洲综合色婷婷六月丁香宅男大增 | 色悠久久久久综合网伊| 伊人色综合一区二区三区影院视频| 亚洲欧美日韩中文在线制服| 国产精品人妻久久无码不卡| 国产成人午夜精品福利| 日本精品人妻无码77777| 国产免费一区二区三区不卡| 亚洲精品日韩久久精品|