Androidレイアウト-ImageViewフォッズに焦点を当てていますが、画面には何も表示されません(ハイライトなし)
質問
ImageViewをクリック可能でフォーカス可能に設定すると機能しますが、どの画像が焦点を合わせているかを伝える方法はありません。ユーザーが現在焦点を合わせていることを知っているので、ビューの周りにオレンジ色の境界線を描くための最良の方法は何ですか?
LinearLayoutにドロップして、代わりにフォーカス可能でクリック可能になるように設定しようとしましたが、運はありませんでした。マージンをかけたとしても、それが選択されたことを示すものは何もありません。
解決
セレクターを背景として描画可能なものを使用できます。
たとえば、res/drawableでgallery_image_bg.xmlを持っています:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="true">
<item android:state_selected="true">
<shape android:shape="rectangle">
<solid android:color="#E6E4E0"/>
<stroke android:width="3dp" android:color="#F9C11E"/>
<padding android:left="3dp"
android:top="3dp"
android:right="3dp"
android:bottom="3dp" />
</shape>
</item>
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#E6E4E0"/>
<stroke android:width="3dp" android:color="#F9C11E"/>
<padding android:left="3dp"
android:top="3dp"
android:right="3dp"
android:bottom="3dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="#E6E4E0"/>
<stroke android:width="3dp" android:color="#FFF"/>
<padding android:left="3dp"
android:top="3dp"
android:right="3dp"
android:bottom="3dp" />
</shape>
</item>
</selector>
これにより、画像の周りに3つの異なる3DPラインが作成されます。パディングにより、画像がわずかに小さい領域でレンダリングされるように強制されるため、それらは見える。
SOのようなコードで使用:
image.setBackgroundResource(R.drawable.gallery_image_bg)
他のヒント
簡単な解決策は、クリックに応答し、ImageViewにオレンジ色の境界線を設定するリスナーを使用することです...
imageView.setOnClickListener(listener)
ただし、すべてのImageViewアイテムに対してそれを行う必要があります。少なくとも彼らは同じリスナーを共有できます。
長い解決策は、クリックに応じて独自のオレンジ色の境界線を引き出すImageViewを拡張する独自のビューを実装することです。
これをラジオボタンのように動作させたいと思います。イメージビューをクリックすると、以前に選択されたImageViewからボーダーが削除されますか?したがって、現在選択されているImageViewへの参照を維持するには、共有リスナーが必要になります。これは、新しいImageViewがクリックされたときに「選択」できます。
遅い回答ですが、画像ソースにレイヤードロウ可能なレイヤードローを使用することもできます。そうすれば、背景、パディングなどを台無しにする必要はありません。
LayerDrawable d = new LayerDrawable(new Drawable[]{new BitmapDrawable(myBmp), getResources().getDrawable(R.drawable.my_selector_list)});
imageView.setImageDrawable(d);