2011/02/08

Android のデフォルトアイコンを調べる

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 件のコメント: