Есть ли способ найти идентификатор ресурса для рисования - PullRequest
24 голосов
/ 07 июля 2011

Есть ли способ получить идентификатор ресурса Drawable?Например, я использую ImageView, и я могу сначала использовать icon.png в качестве изображения, но позже я могу изменить изображение на icon2.png.Я хочу узнать с помощью кода, какое изображение использует мой ImageView из ресурса.Есть ли способ?

Ответы [ 7 ]

14 голосов
/ 01 июня 2012

Это лучший способ узнать значение R.drawablw.image1, когда вы нажимаете на ImageView в ur prgoram. Этот метод в некоторой степени похож на тот, который в основной программе сначала сохраняет значение изображения в теге

public...activity 
{
//-----this vl store the drawable value in Tag of current ImageView,which v vl retriew in //image ontouchlistener event...
ImageView imgview1.setTag(R.drawable.img1);
ImageView imgview2.setTag(R.drawable.img2);

onTouchListnener event...
{

  ImageView imageView = (ImageView) v.findViewById(R.id.imgview1)v;
  Object tag = imageView.getTag();                  
  int id = tag == null ? -1 : Integer.parseInt(tag.toString());
switch(id)
{
case R.drawable.img1:
//do someoperation of ur choice
break;
case R.drawable.img2:
//do someoperation of ur choice
break:
    }//end of switch

 }//end of touch listener event

  }//end of main activity

               "PIR FAHIM SHAH/kpk uet mardan campus"
6 голосов
/ 07 июля 2011

Вы пытаетесь определить, какое текущее изображение находится на imageview, чтобы заменить его другим изображением?

Если это так, я предлагаю делать все, используя код вместо xml.

т.е. Используйте setImageResource() для установки начальных изображений во время инициализации и отслеживайте resource ids, используемый где-то в вашем коде.

Например, вы можете иметь массив imageviews с соответствующим массивом int, который содержит resource id для каждого imageview

Затем, когда вы захотите изменить изображение, переберите массив и посмотрите, что это за идентификатор.

5 голосов
/ 23 мая 2015

Создайте собственный просмотр изображений, остальное просто.

public class CustomImageView extends ImageView {

    private int resID;

    public CustomImageView(Context context) {
        super(context);
    }

    public CustomImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setImageResource(int resId) {
        this.resID = resId;
        super.setImageResource(resId);
    }

    public int getResourceId() {
        return resID;
    }
}
0 голосов
/ 19 августа 2015

Другой подход: вам просто нужно создать свой собственный вид. и на создание. затем выполните итерацию объекта AttributeSet (attrs), чтобы найти индекс вашего атрибута. затем просто вызовите getAttributeResourceValue с индексом, после чего вы получите начальное значение ResouceID. простой пример расширения ImageView для получения ResourceID для фона:

public class PhoneImageView extends ImageView {

    private static final String BACKGROUND="background";
    private int imageNormalResourceID;

    public PhoneImageView(Context context) {
        super(context);
    }

    public PhoneImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        for (int i = 0; i <attrs.getAttributeCount() ; i++) {
            if(attrs.getAttributeName(i).equals(BACKGROUND)){
                imageNormalResourceID =attrs.getAttributeResourceValue(i,-1);
            }
        }
    }

    public PhoneImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


}

Этот подход подходит для тех, кто хочет сохранить начальные значения. Решение, предоставленное Бояном Ксенеманом (+1 голос), заключается в сохранении ref для resourceID при каждом изменении представления.

0 голосов
/ 17 октября 2013

Я теперь, что вопрос довольно старый, но, возможно, кто-то найдет его полезным.

У меня есть список TextViews с Drawables и я хочу установить прослушиватели щелчков для всех из них, без необходимости менятькод, когда макет меняется.

Так что я поместил все рисованные объекты в хэш-карту, чтобы позже получить их идентификаторы.

main_layout.xml

<LinearLayout android:id="@+id/list" >

    <TextView android:drawableLeft="@drawable/d1" />
    <TextView android:drawableLeft="@drawable/d2" />
    <TextView android:drawableLeft="@drawable/d3" />
    <TextView android:drawableLeft="@drawable/d4" />
    <!-- ... -->
</LinearLayout>

MyActivity.java

import java.lang.reflect.Field;
import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable.ConstantState;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MyActivity extends Activity {

    private final HashMap<ConstantState, Integer> drawables = new HashMap<ConstantState, Integer>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main_layout);

        for (int id : getAllResourceIDs(R.drawable.class)) {
            Drawable drawable = getResources().getDrawable(id);
            drawables.put(drawable.getConstantState(), id);
        }

        LinearLayout list = (LinearLayout)findViewById(R.id.list);

        for (int i = 0; i < list.getChildCount(); i++) {

            TextView textView = (TextView)list.getChildAt(i);       
            setListener(textView);

        }
    }

    private void setListener(TextView textView) {

        // Returns drawables for the left, top, right, and bottom borders.
        Drawable[] compoundDrawables = textView.getCompoundDrawables();

        Drawable left = compoundDrawables[0];

        final int id = drawables.get(left.getConstantState());

        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent broadcast = new Intent();

                broadcast.setAction("ACTION_NAME");

                broadcast.putExtra("ACTION_VALUE", id);

                sendBroadcast(broadcast);
            }
        });
    }

    /**
     * Retrieve all IDs of the Resource-Classes
     * (like <code>R.drawable.class</code>) you pass to this function.
     * @param aClass : Class from R.X_X_X, like: <br>
     * <ul>
     * <li><code>R.drawable.class</code></li>
     * <li><code>R.string.class</code></li>
     * <li><code>R.array.class</code></li>
     * <li>and the rest...</li>
     * </ul>
     * @return array of all IDs of the R.xyz.class passed to this function.
     * @throws IllegalArgumentException on bad class passed.
     * <br><br>
     * <b>Example-Call:</b><br>
     * <code>int[] allDrawableIDs = getAllResourceIDs(R.drawable.class);</code><br>
     * or<br>
     * <code>int[] allStringIDs = getAllResourceIDs(R.string.class);</code>
     */
    private int[] getAllResourceIDs(Class<?> aClass) throws IllegalArgumentException {
            /* Get all Fields from the class passed. */
            Field[] IDFields = aClass.getFields();

            /* int-Array capable of storing all ids. */
            int[] IDs = new int[IDFields.length];

            try {
                    /* Loop through all Fields and store id to array. */
                    for(int i = 0; i < IDFields.length; i++){
                            /* All fields within the subclasses of R
                             * are Integers, so we need no type-check here. */

                            // pass 'null' because class is static
                            IDs[i] = IDFields[i].getInt(null);
                    }
            } catch (Exception e) {
                    /* Exception will only occur on bad class submitted. */
                    throw new IllegalArgumentException();
            }
            return IDs;
    }

}

Метод getAllResourceIDs Я использовал здесь

0 голосов
/ 30 ноября 2011

Есть несколько шагов к этому:

  1. создание целочисленного массива xml для хранения имен нарисованных объектов (например: "@ drawable / icon1" ... "@ drawable / iconN"

  2. используйте getIdentifier выше, чтобы получить "массив"

  3. с идентификатором для списка доступных для рисования, getStringArray выдаст вам имена массивов, которые вы указали в шаге 1.

  4. затем снова используйте любое имя для рисования в массиве с getIdentifier, чтобы получить ID для рисования. Это использует "drawable" вместо типа "array".

  5. используйте этот идентификатор для установки изображения для вашего просмотра.

Надеюсь, это поможет.

0 голосов
/ 07 июля 2011

Вы можете получить идентификатор изображения с его именем, используя следующий код.

int drawableImageId = getResources().getIdentifier(imageName,"drawable", getPackageName());
...