« PDFBox を使おうとしたが無理そう | メイン | Androidアプリはどの程度売れるのか? »

2011年05月02日

Android:: 設定画面のリストに画像を埋め込む

    

設定画面 ( PreferenceActivity ) で、addHeaderView を使って任意のビューをリストに埋め込むのは厳しいようだ。
最初に埋め込んだ下の列が 1個ずつずれて、表示と動作が変わってしまう。
設定画面に画像を入れて、設定変更でその画像が変化するようにしようとしていたんだが、この方法では無理だった。

結局、Preference を継承した独自の Preference を作って、それを組み込むことに。
リストに表示されるビューは、preference の XML の方に、android:layout="@layout/pref_image_layout" と言うようにレイアウト入れることで、これが使用されるようになる。
継承した Preference でメソッド呼んで設定してもいけると思うが、XML で設定しておいた方が楽。
継承した Preference で実際に画像を表示するには、onBindView をオーバーライドして、ここからレイアウトから ID で ImageView を得て、これに画像を設定してやればいい。
設定する画像は、setImageBitmap 等適当なメソッド追加して、これに PreferenceActivity (を継承したクラス) から画像を設定すれば、設定画面内に画像が表示され、設定変更に従って画像の切り替えが出来るようになる。

継承した Preference のソースは以下。
上に書いていることそのまんま。

class InlineImagePreference extends Preference {
    private Bitmap mImageBitmap;
    private ImageView mInlineImage;

    public InlineImagePreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
        if( mImageBitmap != null ) {
            mInlineImage = (ImageView)view.findViewById(R.id.inline_image);
            if( mInlineImage != null ) {
                mInlineImage.setImageBitmap( mImageBitmap );
            }
        }
    }
    public void setImageBitmap( Bitmap bmp ) {
        mImageBitmap = bmp;
        notifyChanged();
    }
};

レイアウトファイルは以下。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="center_horizontal">

    <ImageView
        android:id="@+id/inline_image"
        android:scaleType="center"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent" />

    <ImageView
        android:layout_height="1dip"
        android:layout_width="fill_parent"
        android:src="@drawable/divider_horizontal_light" />

</LinearLayout>

preference の XML には、以下の要素を追加。xxx はパッケージ。

<xxx.xxx.xxx.InlineImagePreference
    android:key="inline_image_key"
    android:selectable="false"
    android:persistent="false"
    android:layout="@layout/pref_image_layout" />

設定画面にプレビュー画像を入れたいような場合は、このような方法が役に立つ。



投稿者 Takenori : 2011年05月02日 21:04



コメント

1ヶ月以上悩んで、解決しなかったのと同じ話題のようでしたので、試したんですが、私、アンドロイド開発初心者につき、どのようにアクティビティで利用したらよいのかがわからず悪戦中です・・。もしよろしければ、貴殿のサンプルが実際に動作している様や、アクティビティでの実装方法など伝授いただければ幸いです。

投稿者 ハチビ~ : 2011年05月03日 20:56

記事の説明とソースコードを読んで扱えないのだとしたら、基本的な部分でつまずいていると思われますので、基礎を勉強された方が良いと思います。

投稿者 Takenori : 2011年05月12日 23:23

こんばんわ。
独自のレイアウト部分はPreference.setEnabledで
きちんとグレーアウトされますか?

投稿者 ノイビ~ : 2011年05月26日 23:05

こんばんは。
Preference.setEnabled は今回使用していないので、確認していません。
それでは。

投稿者 Takenori : 2011年05月28日 23:18


comments powered by Disqus
Total : Today : Yesterday : なかのひと