2011/02/08
Android のデフォルトアイコンを調べる
android.R.drawable.xxx
と書くことでデフォルトで用意されているアイコンなどを使用することができます。
(Rの前に android とついているところがポイントです)
どのようなアイコンが使えるのか調べるためには、
android-sdk-dir/platforms/android-X/data/res
を見れば良いのですが、このディレクトリにあるアイコン全部を使えるわけではないのです。
どうも、「layout で使う用」と「一般に公開する用」で出しわけている模様。
「デフォルトで使えるアイコンの一覧が欲しいなぁ」と思って探してみたものの、見つかりませんでした。(あんまり本気で探してないから、本当はあるかも)
プログラマーたるもの、無いものは作れば良いのです。
というわけで、作ってみました。
意外とあっさり。リフレクションって素晴らしい!
まず、表示用の list_item.xml を作成します
res/layout/list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:id="@+id/ImageView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
あとはいつもの如く Activity を作成するだけ。
MainActivity.class
import java.lang.reflect.Field;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;
public class MainActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// andrdoid.R.drawable クラスの持っているフィールドをすべて取得
Field[] fields = android.R.drawable.class.getFields();
// フィールドをアダプタに
ListAdapter adapter = new ListItemAdapter(
this, R.layout.list_item, fields);
setListAdapter(adapter);
}
/**
* アイコンとその名前を表示するためのアダプタ
*/
private class ListItemAdapter extends ArrayAdapter<Field> {
private final LayoutInflater mInflater;
private final int mResource;
private final Field[] mFields;
public ListItemAdapter(
Context context,
int resource,
Field[] fields) {
super(context, resource, fields);
mInflater = (LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
mResource = resource;
mFields = fields;
}
@Override
public View getView(
int position,
View convertView,
ViewGroup parent) {
View view;
if (convertView != null) {
view = convertView;
} else {
view = mInflater.inflate(mResource, null);
}
ImageView imageView = (ImageView)view.findViewById(
R.id.ImageView01);
try {
// static フィールドからidを取得して、
// imageView に表示
imageView.setImageResource(
mFields[position].getInt(null));
} catch (IllegalArgumentException e) {
view.setVisibility(View.INVISIBLE);
return view;
} catch (IllegalAccessException e) {
view.setVisibility(View.INVISIBLE);
return view;
}
// フィールドの名前を表示
TextView textView = (TextView)view.findViewById(
R.id.TextView01);
textView.setText(mFields[position].getName());
return view;
}
}
}
実行してみると、以下のような感じです。結構大量です。

0 件のコメント:
コメントを投稿