Подтвердить что ты не робот

Более простой способ получить представление Id (string) по его идентификатору (int)

Я новичок в android и java, поэтому извините, если это слишком простой вопрос, но я попытался найти решение на форумах и Google, и я не смог.

У меня есть 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();
    }
}

Мой вопрос: если нет более простого способа получить этот идентификатор?

Спасибо заранее.

4b9b3361

Ответ 1

С самого начала этот подход ошибочен. Если вы хотите связать кусок произвольных данных (например, строку) с представлением, для чего предназначен tag. Идентификатор является числовым, и лучше оставаться таким образом.

Ответ 2

как это:

/**
 * @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());
}

Я использую это в конструкторах представления, чтобы сделать более значимые теги

Ответ 3

Edit:

Вы должны использовать

getResources().getResourceEntryName(int resid);

Если вы хотите получить имя записи, связанную с resId

или

Вы можете использовать getIdentifier() для извлечения идентификатора ресурса для данного имени ресурса.

Например:

int id = this.getResources().getIdentifier("yourtext", "string", this.getPackageName());

Ответ 4

Вы можете проверить идентификатор каждой кнопки таким образом:

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;
    }
}

Ответ 5

Вы можете поместить это toString() в Android-представление, оно вернет идентификатор ресурса String.

@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;
}

Ответ 6

   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();

Вы получите результат; ТВ

Ответ 7

Версия Kotlin (из @gadget) в качестве расширения:

val View.stringId: String
    get() {
        return if (this.id == -0x1)
            "no-id"
        else
            this.resources.getResourceName(this.id)
    }

Ответ 8

Попробуйте метод ниже, чтобы получить идентификатор вида.

@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;
}

Ответ 9

Это поздний ответ, но он может быть полезен тем, кто ищет способ получить идентификатор ресурса (int) для любого представления /drawable/String programmatic.

изображение из 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());