Как получить имя ресурса из идентификатора ресурса

158


В моем макете я определил что-то вроде этого.

<RadioButton
    android:id="@+id/radio1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Dnt want this text" />

Предположим, что какая-то функция в активности возвращает мне этот идентификатор (идентификатор radioButton). Теперь я хочу получить этот текст radio1 из этого идентификатора. Короче хочу получить текст radio1, написанный наandroid:id="@+id/radio1"

Может кто-нибудь сказать мне, как это возможно?

Code_Life
источник
Это длинная история ... Мне нужно заполнить данные в большом количестве editText из некоторых данных, полученных с сервера. Поэтому вместо того, чтобы вручную устанавливать данные для всех текстовых полей, я пишу метод, который мог бы работать для меня ... для этого мне нужно это.
Code_Life

Ответы:

363

В своей деятельности попробуйте это:

  1. чтобы получить строку как radio1:

    getResources().getResourceEntryName(int resid);
  2. чтобы получить строку как com.sample.app:id/radio1:

    getResources().getResourceName(int resid);

В Котлине сейчас:

val name = v.context.resources.getResourceEntryName(v.id)
Shubhayu
источник
4
Спасибо за ответ, я потратил большую часть часа на поиски этой проблемы - сайт разработчиков постоянно указывал мне на getString (), что было чертовски бесполезно для этого.
Стив
8
Есть идеи, в чем разница между getResourceEntryName(int resid)и getResourceName(int resid)?
Джошуа Пинтер
10
@JoshPinter, ссылка говорит: getResourceEntryName: вернуть имя записи для данного идентификатора ресурса. GetResourceName: вернуть полное имя для данного идентификатора ресурса. Это имя представляет собой единственную строку в форме «package: type / entry». В этом случае разница, по-видимому, заключается в добавленном пакете: type для getResourceName
Jose_GD
@Shubhayu - как вы можете сделать это в тесте эспрессо? Функция getResources () не доступна!
1ак31ша
Я бы не рекомендовал использовать его, если вы используете Proguard ( minifyEnabled true), особенно дляgetResources().getIdentifier(...
user25
9

У вас есть идентификатор (тип 'long') из этого идентификатора, который вы хотите использовать для идентификатора переключателя (имя), который является radio1 . Вы используете это

getResources().getResourceEntryName(id);

при использовании выше вы можете получить название радио кнопки, т.е. радио1. здесь идентификатор параметра, который у вас есть (длинный тип) . Попробуйте это, это поможет вам на 100%.

Анил Джадхав
источник
2
Спасибо. Рад, что кто-то на самом деле ответил на вопрос вместо обычных ответов «зачем тебе этот [noob]». Наличие имени элемента во время итерации по ним НЕОБХОДИМО для отладки. Я имею в виду, действительно, как я собираюсь найти TextView с идентификатором 354814715? (который, если я не ошибаюсь, даже не постоянен между компиляциями) - не уверен, зачем это нужно OP, но мне нужно было, чтобы убедиться, что моя функция масштабирования шрифтов фактически итерирует, хотя все подэлементы.
Стив
2

Котлин:

val name = v.context.resources.getResourceEntryName(v.id)
Ананд Маквана
источник
2
Может быть, вы можете добавить больше информации о том, какую проблему это решает и как это делает :)
Филипп Мейснер,
@PhilippMeissner это все очевидно
Джемшит Искендеров
Давайте согласимся не соглашаться.
Филипп Мейснер
1

Если я прав, то, что вы хотели получить, это слово «radio1» (из самого идентификатора?), Так что если это так, то сначала вам нужно получить его идентификатор.

int intname= buttonname.getId();

тогда получите результат

String stringname= getResources().getResourceEntryName(intname);

надеялся, что помог

Фахад Максуд Кази
источник
-1

Вы имеете в виду, что хотите взять текст строки идентификатора?

Поскольку вы определили это, вы должны знать, что это такое.

Если у вас есть макет, и вы хотите узнать, имеет ли View определенный идентификатор, вы можете просмотреть весь макет и проверить с помощью getId (), является ли id каждого View идентификатором, который вы ищете.

Надеюсь, это поможет (если я правильно понял, ваш вопрос .. :))

Димитрис Макрис
источник
Нет, ты все неправильно понял. Я хочу получить текст radio1 с Android: id = "@ + id / radio1"
Code_Life
Текст radio1 является идентификатором вашего просмотра. Это не простой текст, который вы можете получить, разделить и т. Д. Чтобы лучше вам помочь, вы можете сказать нам, для чего именно вам нужен этот текст?
Димитрис Макрис
@DimitrisMakris: это длинная история .. мне нужно заполнить данные в большом количестве editText из некоторых данных, полученных с сервера. Поэтому вместо того, чтобы вручную устанавливать данные для всех
текстовых полей
Поэтому, если у вас есть ответ 10, например, строк, которыми вы хотите заполнить 10 радиокнопок, я думаю, что решением может быть динамическое создание этих радиокнопок и установка их значения. Другим подходом может быть использование ListView с радиокнопками в качестве элементов списка, если это, конечно, соответствует вашим потребностям в отношении макета.
Димитрис Макрис
Спасибо за ваш отдых. Но вы все неправильно поняли, у меня есть 10 editBox, и я получаю в виде строки json значение, которое будет заполнено в этих 10 полях редактирования, после того как эта строка будет проанализирована, она преобразуется в HashMap. Теперь вместо этого вручную сопоставляем каждое значение (соответствующее ключу hashmap) с текстом editText. Я пишу метод, который мог бы работать для меня.
Code_Life