ItemDetailActivityの実装
では、「RssReaderActivity」を再度修正しよう。リストの項目を選択した時にインテントを生成し、アクティビティを起動するという処理を追加する。ここでは、明示的なインテントを使って送信先のアクティビティを指定している。
// RssReaderActivity.java
public class RssReaderActivity extends ListActivity {
private static final String RSS_FEED_URL = "http://itpro.nikkeibp.co.jp/rss/ITpro.rdf";
private RssListAdapter mAdapter;
private ArrayList<Item> mItems;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Itemオブジェクトを保持するためのリストを生成し、アダプタに追加する
mItems = new ArrayList<Item>();
mAdapter = new RssListAdapter(this, mItems);
// タスクを起動する
RssParserTask task = new RssParserTask(this, mAdapter);
task.execute(RSS_FEED_URL);
}
// リストの項目を選択した時の処理
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Item item = mItems.get(position);
Intent intent = new Intent(this, ItemDetailActivity.class);
intent.putExtra("TITLE", item.getTitle());
intent.putExtra("DESCRIPTION", item.getDescription());
startActivity(intent);
}
}
リストの項目を選択した時のイベントは、「onListItemClick」メソッドをオーバーライドして実装する。明示的なインテントの場合、第一引数に呼び出し元のアクティビティ、第二引数に送信先のアクティビティを指定する。
ここで、メソッド内のposition変数は選択した項目の位置を示しており、その位置におけるItemオブジェクト(つまり、選択した記事)から記事のタイトルと内容を取得している。
取得したデータは「putExtra」メソッドを使うことで、付加情報としてインテントに格納することができる。putExtraメソッドの第一引数には、取得の際必要となる任意の文字列(キー)、第二引数には格納したいデータを指定する。先程と同様、アクティビティを起動する時は「startActivity」メソッドをコールする。
次に、記事の詳細画面を表示する「ItemDetailActivity」を新たに定義しよう。以下がそのコードと、レイアウト用のXMLだ。
// ItemDetailActivity.java
public class ItemDetailActivity extends Activity {
private TextView mTitle;
private TextView mDescr;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.item_detail);
Intent intent = getIntent();
String title = intent.getStringExtra("TITLE");
mTitle = (TextView) findViewById(R.id.item_detail_title);
mTitle.setText(title);
String descr = intent.getStringExtra("DESCRIPTION");
mDescr = (TextView) findViewById(R.id.item_detail_descr);
mDescr.setText(descr);
}
}
<?xml version="1.0" encoding="utf-8"?>
<!-- item_detail.xml -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/item_detail_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:background="@android:drawable/dark_header" />
<TextView
android:id="@+id/item_detail_descr"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
「RssReaderActivity」から送信されたインテントを「getIntent」メソッドで受信する。インテントに付記された情報はget~Extraメソッドで取得できる。例えば、データが文字列型の場合は「getStringExtra」メソッドで取得する。ほかにも、数値型やブーリアン型など様々な型のデータをこのインテントを介してやりとりできる。
新たにアクティビティを追加する際、マニフェストファイルへの宣言も忘れてはならない。「AndroidManifest.xml」を開いて、application要素内に以下のコードを追加しておこう。
<activity
android:name=".ItemDetailActivity">
</activity>