Ответ 1
С самого начала этот подход ошибочен. Если вы хотите связать кусок произвольных данных (например, строку) с представлением, для чего предназначен tag
. Идентификатор является числовым, и лучше оставаться таким образом.
Я новичок в 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();
}
}
Мой вопрос: если нет более простого способа получить этот идентификатор?
Спасибо заранее.
С самого начала этот подход ошибочен. Если вы хотите связать кусок произвольных данных (например, строку) с представлением, для чего предназначен tag
. Идентификатор является числовым, и лучше оставаться таким образом.
как это:
/**
* @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());
}
Я использую это в конструкторах представления, чтобы сделать более значимые теги
Edit:
Вы должны использовать
getResources().getResourceEntryName(int resid);
Если вы хотите получить имя записи, связанную с resId
или
Вы можете использовать getIdentifier()
для извлечения идентификатора ресурса для данного имени ресурса.
Например:
int id = this.getResources().getIdentifier("yourtext", "string", this.getPackageName());
Вы можете проверить идентификатор каждой кнопки таким образом:
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;
}
}
Вы можете поместить это 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;
}
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();
Вы получите результат; ТВ
Версия Kotlin (из @gadget) в качестве расширения:
val View.stringId: String
get() {
return if (this.id == -0x1)
"no-id"
else
this.resources.getResourceName(this.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;
}
Это поздний ответ, но он может быть полезен тем, кто ищет способ получить идентификатор ресурса (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());