66

私はアンドロイドとジャバに慣れていないので、それがあまりにも基本的な質問であるならば申し訳ありませんが、私はフォーラムとグーグルで解決策を見つけようとしました、そして私はできませんでした。

レイアウトに24個のボタンがありますが、これらのボタンはすべて同じようなことをするので、ジェネリック関数を作成したいと思います。しかし、最初に私は彼のボタンの名前(xml id)を知る必要があります。

これはボタンのXMLコードです。

  <Button
      android:id="@+id/add_04"
      android:layout_width="42dp"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:layout_marginLeft="15dp"
      android:background="@xml/zbuttonshape"
      android:onClick="onClick"
      android:text="@string/mas" />

すべてのボタンにandroid:onClick="onClick"を設定しました。

私のアクティビティでは、onClickで新しい関数を作成しました。

これは私が試したコードです:

public void onClick(View v) {
        String name = v.getContext().getString(v.getId());
        String name2 = context.getString(v.getId());
        String name3 = getString(v.getId());
        String name4 = getResources().getString(v.getId()); 
}

しかし、名前(この場合は「add_04」)を取得しようとすると、常に「false」になります。

最後に、次のコードで解決策を見つけました。

import java.lang.reflect.Field;

String name5 = null;
Field[] campos = R.id.class.getFields();
for(Field f:campos){
     try{
        if(v.getId()==f.getInt(null)){
            name5 = f.getName();
            break;
        }
       }
       catch(Exception e){
        e.printStackTrace();
    }
}

私の質問は、このIDを取得する簡単な方法がないかどうかです。

前もって感謝します。

4

9 に答える 9

154

このような:

/**
 * @return "[package]:id/[xml-id]"
 * where [package] is your package and [xml-id] is id of view
 * or "no-id" if there is no id
 */
public static String getId(View view) {
    if (view.getId() == View.NO_ID) return "no-id";
    else return view.getResources().getResourceName(view.getId());
}

これをビューコンストラクターで使用して、より意味のあるTAGを作成します

于 2013-08-05T20:58:26.963 に答える
43

そもそもこのアプローチは誤った方向に進んでいます。任意のデータ(文字列など)をビューに関連付けたい場合は、それtagが目的です。IDは数値であり、そのままにしておくことをお勧めします。ただし、注意点として、タグはAndroidで一意ではありません。同じビュー・ツリー内での偶発的なタグの衝突に注意してください。

ずっと後で編集してください:OPの問題はXY問題の場合でした。とはいえ、質問のタイトルだけでも、それ自体が正当な質問です。

于 2013-02-01T14:08:28.077 に答える
28

編集:

あなたは使用する必要があります

getResources().getResourceEntryName(int resid);

resIdに関連付けられているエントリ名を取得する場合

また

を使用getIdentifier() して、指定されたリソース名のリソース識別子を取得できます。

例えば:

int id = this.getResources().getIdentifier("yourtext", "string", this.getPackageName());
于 2013-02-01T14:01:05.263 に答える
19

次のように各ボタンのIDを確認できます。

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.add_04:
        Toast.makeText(MainActivity.this, "1", Toast.LENGTH_LONG).show();
        break;
    case R.id.add_05:
        Toast.makeText(MainActivity.this, "2", Toast.LENGTH_LONG).show();
        break;
    }
}
于 2013-02-01T14:02:32.770 に答える
9
   Use this Approach to get View Id by Programming .
  <TextView
    android:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    />


    String id=getResources().getResourceEntryName(textView.getId());
    Toast.makeText(this,id,Toast.LENGTH_LONG).show();

結果が表示されます; テレビ

于 2018-07-16T07:05:15.400 に答える
7

このtoString()をAndroidビュー内に配置すると、文字列リソースIDが返されます。

@Override
public String toString() {

    Context context;
    Resources r = null;

    context = getContext();

    if (context != null) {
        r = context.getResources();
    }

    String entryName = null;

    if (r != null)
        entryName = r.getResourceEntryName(getId());

    return entryName;
}
于 2014-05-13T10:05:24.130 に答える
2

ビュー拡張としてのKotlinバージョン(@gadgetから):

val View.stringId: String
    get() {
        return if (this.id == -0x1)
            "no-id"
        else
            this.resources.getResourceName(this.id)
    }
于 2017-12-17T15:20:53.390 に答える
2

これは遅い答えですが、任意のビュー/ドローアブル/文字列プログラムのリソースID(int)を取得する方法を探している人に役立つ場合があります。

res/drawableからの画像

int resID = getResources().getIdentifier("my_image", 
            "drawable", getPackageName());

リソース名に基づくビュー

int resID = getResources().getIdentifier("my_resource", 
            "id", getPackageName());

ストリング

int resID = getResources().getIdentifier("my_string", 
            "string", getPackageName()); 
于 2019-07-19T06:18:43.213 に答える
0

@KingofMassesによる答えは素晴らしいです。これがKotlinの私のです:

res/drawableからの画像

val viewId = context.resources.getIdentifier("my_image", "drawable", context.packageName)

リソース名に基づくビュー

val viewId = context.resources.getIdentifier("my_textview_id", "id", context.packageName)

ストリング

val viewId = context.resources.getIdentifier("my_string", "string", context.packageName)

レイアウト

val viewId = context.resources.getIdentifier("my_custom_layout", "layout", context.packageName)
于 2022-01-27T10:26:47.297 に答える