今、Androidタブレットでウィジェットを作っています。
そこでわかったことなどをちょっと纏めておきます。自分用に。
まず、ウィジェットですが、ウィジェットでは使えるViewがかなり制限されていて、リストとかグリッドとかを作ることができませんでした(擬似的にはできるだろうけど)。いままではウィジェット内でスクロールするものとか作れなかったのです。どうもホームアプリを自分で作っていれば、擬似的にウィジェットっぽい普通のViewを作ることも可能だったようですが、それだと単にホームアプリが変わったら機能しなくなりますし、微妙でした。自分も事前知識としてそういうふうに思っていたので、XOOMのGmailやYouTube、ブラウザのブックマークのウィジェットはどうやって実装しているのだろうと凄い悩んでいたのですが、単にハニカムからListView, GridView,StackViewなどのサポートが行われるようになったとのことでした。
参考URL
http://developer.android.com/intl/ja/guide/topics/appwidgets/index.html
StackView Widgetを使ったサンプルはこっち(StackViewはYouTubeのウィジェットのやつ)
http://developer.android.com/intl/ja/resources/samples/StackWidget/index.html
Cursorを使ったサンプルはこれ。
http://developer.android.com/intl/ja/resources/samples/WeatherListWidget/index.html
これらのViewを使えば、今まで使えなかったリッチなUIをウィジェットでも使うことができるので、よりタブレットらしいウィジェットが作れるかと思います。作り方に関しては、上記のURLにある程度参考情報が載っていますので、読んでみたらいいかと思います。英語ですが。
上記のURLの内容を要約しますと、
- RemoteViewsServiceというサービスクラスを継承したクラス作成(要マニフェストに追加。方法は上記URLを参照)
- 上記のサービス内でRemoteViewsFactoryのインターフェースを実装したクラスを作成し、扱いたいアイテム(ArrayListなりCursorなりをonCreateやonDataSetChangedを生成しとく)に合わせてgetViewAtメソッド内で実装。
- アイテムへのイベント設定はRemoteView.setonClickPendingIntentではなく、RemoteView.setOnClickFillInIntentで行う。
- setOnClickFillInIntentで実行したい処理は、ウィジェットのonResume内で実装
- AppWidgetProviderのonUpdateでRemoteViewsServiceを呼び出すIntent生成して、RemoteView.setRemoteAdapterを呼ぶ。これで、RemoteViewsFactory.getViewAtメソッドで実装したViewの描画処理が行われる
という感じ?まぁ概要をざっと書いてみましたが、すごい適当です。間違ってたらすみません。でも動作チェックまでやってみたので、合ってると思います。
リッチなUIがホームに置けるというだけでも、わざわざアプリを起動しなくてもよくなるわけですから、ユーザとしても利便性が増すと思います。積極的にウィジェット作成を狙っていきたいところですねー。