TokyoFacebookTwitterHatenaPocketAndroidアプリのウィジェットでリストを表示する「コレクションウィジェット」の設定方法を解説します。以前のバージョンのAndroidは、アプリのウィジェットでの表示はTextViewとImageViewに限られていました。翌週の予想気温をリストで表示するように、ウィジェットでアイテムのリストを表示できませんでした。3.0でListView、GridView、StackViewが表示できる「コレクションウィジェット」が導入されました。Todoアプリ用のウィジェットを作成しましょう。保留中のタスクをリスト表示するためにコレクションウィジェットを使います。この記事がコレクションウィジェットの動作を理解する助けとなれば幸いです。ウィジェットの基本的な作成方法を知っているものとして進めます。基本がわからない人はオリジナルのコレクションウィジェット作成する準備として、こちらの記事を参考にしてください。始めに作成に使うプロジェクトのスターターコードをこちらからダウンロードしてください。コードには基本のウィジェットが実装されています。このプロジェクトにコレクションウィジェットを作成します。基本のウィジェットでは「保留中のタスクの数」が表示されますが、コレクションウィジェットでは「完全なリスト」を表示します。コレクションウィジェットの作成には、次の2つのコンポーネントを追加します。RemoteViewsFactoryRemoteViewsService上記コンポーネントの動作を説明します。RemoteViewsFactoryRemoteViewsFactoryはウィジェットのコンテキストでアダプターの役割を果たします。アダプターはListViewやGridViewなどコレクションのアイテムとデータセットを接続するものです。クラスをプロジェクトに追加します。Javaで新しいクラスを作成してクラス名を「MyWidgetRemoteViewsFactory」とし、RemoteViewsService.RemoteViewsFactoryを実装します。}}上のコードでMyWidgetRemoteViewsFactoryはRemoteViewsFactoryクラスのメソッドを次のようにオーバーライドしています。onCreate:ウィジェットを最初に作成したとき呼び出すonDataSetChanged:ウィジェットの更新時に呼び出すgetCount:カーソル中のレコード数(ここではウィジェットの表示が必要なタスクアイテム数)を返すgetViewAt:処理中の全作業を扱う。RemoteViewsオブジェクト(ここでは1個のリストアイテム)を返すgetViewTypeCount:ListView中に含まれるビュータイプの数を返す。1となるRemoteViewsServiceRemoteViewsServiceの目的は、ウィジェットに適切なデータを格納したRemoteViewsFactoryオブジェクトを返すことです。このクラスはさほど込み入ったものではありません。RemoteViewsServiceクラスを継承した新しいクラス「MyWidgetRemoteViewsService」を作成します。}}ほかのAndroidのサービスと同様、サービスをマニフェストファイルに登録します。android:name=".AppWidget.MyWidgetRemoteViewsService"android:permission="android.permission.BIND_REMOTEVIEWS"></service>専用のパーミッション「android.permission.BIND_REMOTEVIEWS」によってシステムと作成中のサービスをひも付けします。各行にウィジェットのビューが作成され、別のアプリはこのウィジェットのデータにアクセスできなくなります。追加のコンポーネントを設定したところで、RemoteViewsServiceを呼び出すWidgetProviderを作成します。AppWidgetのパッケージに新しいクラス「CollectionAppWidgetProvider」を作成し、次のように記述します。}}ウィジェットのレイアウトを作成res/xmlに新しいリソースファイルを作成し、ファイル名を「collection_widget.xml」とします。このファイルは、ユーザーエクスペリエンス向上のためのウィジェットに使用したり、プレビュー画像を追加したりするレイアウトファイルを指定するなど、ウィジェットの設定を定義します。android:widgetCategory="home_screen"></appwidget-provider>リソースファイルをもう1つ作成して今度はres/layoutに置き、ファイル名を「collection_widget.xml」とします。このファイルはコレクションウィジェットのレイアウトを定義します。上位にタイトルを、その下位にタスクのリストを表示するListViewを記述します。</LinearLayout></LinearLayout>各リストアイテムのレイアウトを定義するためのファイルをres/layoutにもう1つ作成します。ファイル名を「collection_widget_list_item.xml」とします。android:layout_height="wrap_content"></TextView></LinearLayout>アプリを起動してください。ウィジェットにTodoアイテムが表示されているのを確認できるはずです(必ずアプリを再インストールして変更を確認してください。Runオプションを無効にできます)。ウィジェットを手動で更新するロジックでは、Todoアイテムを新しく作成するたびにWidgetProviderにブロードキャストを送信しなければなりません。「CollectionAppWidgetProvider」クラスに新しくメソッドを定義します。context.sendBroadcast(intent);}CollectionAppWidgetProviderクラスのonReceiveメソッドをオーバーライドします。intent);}新しいTodoタスクの作成時に、CollectionAppWidgetProviderで定義されたsendRefreshBroadcastメソッドを呼び出します。MainActivityで対応したaddTodoItemメソッドを変更します。作成中のウィジェットでは上部にタイトルを、下部にリストビューを記述しています。ユーザーがタイトルをクリックするとアプリを起動して、リストビューのアイテムをクリックするとタスクの詳細を表示します。このTodoアプリでタスクの詳細はさほど役に立たないかもしれませんが、コンセプトを理解するために設定します。単一のビューでのクリックイベントTextViewやImageViewといったビューにクリックイベントを追加するのはとても簡単です。onUpdateメソッドのコードを次のように変更します。}}同様の方法でクリックイベントを追加します。ウィジェットによって動作するコンテキストが異なるので、PendingIntentを使ってクリックイベントを登録します。ListViewアイテムでクリックイベントを設定するListViewアイテムにクリックイベントを追加するのは、ListViewオブジェクトにsetOnItemClickListenerを設定するだけではありません。いくつかのステップが必要です。PendingIntent用にテンプレートを設定します。intent);のあとに追加します。clickPendingIntentTemplate);ListViewアイテムでDetailsActivityを起動します。DetailsActivityは「タスクに関する説明」を表示するものです。RemoteViewsFactoryで新しいRemoteViewsオブジェクトが作成されるたびにテンプレートに書き込みます。MyWidgetRemoteViewsFactoryのgetViewAtメソッドに次のコードを追加します。intentsテンプレートはOKです。ちなみにすべての行でのクリックを有効にするために、collection_widget_list_item.xmlのルート要素にクリックリスナーを設定します。最後に初心者が直面する課題の解決に役立てば幸いです。コードはこちらからダウンロードできます。Singh5年以上の経験をもつフリーランス開発者です。Androidアプリ開発に熱心で、余暇の大半を新しいアイデアやAndroid技術について考えて過ごしています。Universityでコンピューターアプリケーションを学んでいます。