64

私はそれを持っていてImageView、それにドローアブルを設定します。ImageView次に、動的にドローアブルonclickイベントのIDを取得する必要があります。どうすれば入手できますか?

imgtopcolor = (ImageView) findViewById(R.id.topcolor); 
imgtopcolor.setImageResource(R.drawable.dr);  // How do I get this back?

タッチイベントで、imgtopcolor毎回異なるドローアブルを設定していて、ドローアブルを他のドローアブルと比較したいので、ドローアブルIDが必要です。

4

7 に答える 7

66

私が正しく理解していれば、これがあなたがしていることだと思います。

ImageView view = (ImageView) findViewById(R.id.someImage);
view.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        ImageView imageView = (ImageView) view;
        assert(R.id.someImage == imageView.getId());

        switch(getDrawableId(imageView)) {
            case R.drawable.foo:
                imageView.setDrawableResource(R.drawable.bar);
                break;
            case R.drawable.bar:
            default:
                imageView.setDrawableResource(R.drawable.foo);
            break;
        }
    });

右?そのため、その関数getDrawableId()は存在しません。IDは、ドローアブルの作成方法に関するデバイス上のデータの場所への参照にすぎないため、ドローアブルがインスタンス化されたIDを取得することはできません。ドローアブルが構築されると、それを作成するために使用されたresourceIdを取り戻す方法はありません。ただし、タグを使用してこのように機能させることができます

ImageView view = (ImageView) findViewById(R.id.someImage);
view.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        ImageView imageView = (ImageView) view;
        assert(R.id.someImage == imageView.getId());

        // See here
        Integer integer = (Integer) imageView.getTag();
        integer = integer == null ? 0 : integer;

        switch(integer) {
        case R.drawable.foo:
            imageView.setDrawableResource(R.drawable.bar);
            imageView.setTag(R.drawable.bar);
            break;
        case R.drawable.bar:
        default:
            imageView.setDrawableResource(R.drawable.foo);
            imageView.setTag(R.drawable.foo);
            break;
        }
    });
于 2010-12-25T03:52:05.040 に答える
37

すでに別の質問でこのような質問に答えましたが、これについては少し変更します。

残念ながら、getImageResource()またははありませんgetDrawableId()。ただし、ImageViewタグを使用して簡単な回避策を作成しました。

onCreate()の場合:

imageView0 = (ImageView) findViewById(R.id.imageView0);
imageView1 = (ImageView) findViewById(R.id.imageView1);
imageView2 = (ImageView) findViewById(R.id.imageView2);

imageView0.setTag(R.drawable.apple);
imageView1.setTag(R.drawable.banana);
imageView2.setTag(R.drawable.cereal);

次に、必要に応じて、描画可能なIDを取得するための簡単な関数を作成できます。

private int getDrawableId(ImageView iv) {
    return (Integer) iv.getTag();
}

簡単すぎる。

于 2013-01-23T08:04:11.517 に答える
10

現在、この機能はサポートされていません。しかし、私はこれに少しハックを見つけました。

 imageView.setImageResource(R.drawable.ic_star_black_48dp);
 imageView.setTag(R.drawable.ic_star_black_48dp);

したがって、ビューのIDを取得する場合は、そのタグを取得するだけです。

if (imageView.getTag() != null) {
   int resourceID = (int) imageView.getTag();

   //
   // drawable id.
   //   
}
于 2016-09-28T08:47:09.900 に答える
1

簡単な解決策は、ドローアブルIDを一時変数に格納することです。これがあなたの状況にとってどれほど実用的かはわかりませんが、間違いなく迅速な解決策です。

于 2010-12-25T08:11:57.563 に答える
1

StackOverflowを掘り下げて、同様の問題に対する回答を探します。通常、2つのアプローチを提案している人がいます。

  • ドローアブルをメモリにロードし、ConstantStateまたはビットマップ自体を他のものと比較します。
  • ドローアブルIDのタグをビューに設定し、必要に応じてタグを比較します。

個人的には、パフォーマンス上の理由から2番目のアプローチが好きですが、一連のビューに適切なタグを付けるのは面倒で時間がかかります。これは、大きなプロジェクトでは非常にイライラする可能性があります。私の場合、TextViewドローアブル、ImageViewリソース、Viewバックグラウンド、フォアグラウンドを比較する必要がある多くのEspressoテストを作成する必要があります。多くの作業。

そこで私は最終的に、「汚い」作業をカスタムインフレーターに委任するための解決策を思いつきました。膨らんだすべてのビューで、特定の属性を検索し、リソースIDが見つかった場合は、そのビューにタグを設定します。このアプローチは、書道の人たちが使用したものとほとんど同じです。そのための簡単なライブラリを作成しました:TagView

これを使用すると、xmlレイアウトファイルで設定された描画可能なリソースIDを含む、事前定義されたタグを取得できます。

TagViewUtils.getTag(view, ViewTag.IMAGEVIEW_SRC.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_LEFT.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_TOP.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_RIGHT.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_BOTTOM.id)
TagViewUtils.getTag(view, ViewTag.VIEW_BACKGROUND.id)
TagViewUtils.getTag(view, ViewTag.VIEW_FOREGROUND.id)

ライブラリは、実際にはすべての属性をサポートしています。手動で追加できます。Githubの[カスタム属性]セクションを確認するだけです。実行時にドローアブルを設定すると、便利なライブラリメソッドを使用できます。

setImageViewResource(ImageView view, int id)

この場合、タグ付けは内部で行われます。Kotlinを使用する場合は、view自体を呼び出すための便利な拡張機能を作成できます。このようなもの:

fun ImageView.setImageResourceWithTag(@DrawableRes int id) {
    TagViewUtils.setImageViewResource(this, id)
}

実行時のタグ付けで追加情報を見つけることができます

于 2018-03-21T13:04:06.930 に答える
1

私は最近同じ問題に遭遇しました。私は自分のImageViewクラスを実装することでそれを解決しました。

これが私のKotlin実装です:

class MyImageView(context: Context): ImageView(context) {
    private var currentDrawableId: Int? = null

    override fun setImageResource(resId: Int) {
        super.setImageResource(resId)
        currentDrawableId = resId
    }

    fun getDrawableId() {
        return currentDrawableId
    }

    fun compareCurrentDrawable(toDrawableId: Int?): Boolean {
        if (toDrawableId == null || currentDrawableId != toDrawableId) {
            return false
        }

        return true
    }

}
于 2019-03-21T11:33:28.743 に答える
-1

さらに簡単:R.drawableビューのIDにIDを保存するだけです:use v.setId()。次に、で元に戻しv.getId()ます。

于 2014-05-19T03:54:58.180 に答える