DrawableリソースIDを取得する方法はありますか?たとえば、ImageViewを使用していて、最初は画像としてicon.pngを使用しているが、後で画像をicon2.pngに変更したとします。 ImageViewがリソースから使用しているコードをコードを使用して確認したいと思います。何か方法はありますか?
他の画像に変更するために、imageview
にあるcurrent画像を特定しようとしていますか?
その場合は、xmlではなくコードを使用してすべてを行うことをお勧めします。
つまり、setImageResource()
を使用して、初期化中にinitial画像を設定し、コードのどこかで使用されているresource ids
を追跡します。
たとえば、各imageviews
のresource id
を含むint
の対応する配列を持つimageview
の配列を持つことができます。
次に、画像を変更したいときはいつでも、配列をループして、IDを確認します。
これは、Ur prgoramでImageViewをクリックしたときにR.drawablw.image1値を見つけるための最良の方法です。メソッドは、メインプログラムで最初にそのようなタグに画像値を保存します。
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"
カスタムimageviewを作成し、残りは簡単です。
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;
}
}
質問はかなり古くなりましたが、多分誰かが便利だと思うでしょう。
Drawableを備えたTextViewのリストがあり、レイアウトが変更されたときにコードを変更する必要なく、それらすべてのクリックリスナーを設定したいと考えています。
したがって、すべてのドローアブルをハッシュマップに入れて、後でIDを取得しています。
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私は here から使用しました
これにはいくつかの手順があります。
ドローアブルの名前を保持する整数配列xmlを作成します(例: "@ drawable/icon1" ... "@ drawable/iconN")
上記のgetIdentifierを使用して「配列」を取得します
ドローアブルのリストのIDを使用して、getStringArrayはステップ1で指定したドローアブルの配列名を提供します。
次に、配列内の任意のドローアブル名をgetIdentifierとともに使用して、ドローアブルIDを取得します。これは、「配列」タイプの代わりに「描画可能」を使用します。
このIDを使用して、ビューの画像を設定します。
これが役立つことを願っています。
別のアプローチ:独自のカスタマイズされたビューを作成する必要があるだけです。およびonCreate。次に、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);
}
}
このアプローチは、初期値を保存するユーザーに適しています。BojanKseneman(+1投票)が提供するソリューションは、ビューが変更されるたびにresourceIDへの参照を維持するためのものです。