Jak uzyskać nazwę zasobu z identyfikatora zasobu

158


W swoim układzie zdefiniowałem coś takiego.

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

Załóżmy, że jakaś funkcja w działaniu zwraca mi ten identyfikator (id z radioButton). Teraz chcę pobrać tekst radio1 z tego identyfikatora. Krótko mówiąc, chcę pobrać tekst radio1 zapisany wandroid:id="@+id/radio1"

Czy ktoś może mi powiedzieć, jak to możliwe?

Code_Life
źródło
To długa historia .. Muszę umieścić dane w dużej ilości tekstu editText z niektórych danych otrzymanych z serwera. Więc zamiast ręcznie ustawiać dane w całym polu tekstowym, piszę metodę, która może to zadziałać dla mnie ... do tego potrzebuję tego.
Code_Life,

Odpowiedzi:

363

W swojej aktywności wypróbuj te:

  1. aby uzyskać ciąg taki jak radio1:

    getResources().getResourceEntryName(int resid);
  2. aby uzyskać ciąg taki jak com.sample.app:id/radio1:

    getResources().getResourceName(int resid);

W Kotlinie teraz:

val name = v.context.resources.getResourceEntryName(v.id)
Shubhayu
źródło
4
Dziękuję za odpowiedź, spędziłem większą część godziny na wyszukiwaniu w Google tego problemu - strona deweloperów wskazywała mi na getString () - co było cholernie bezużyteczne do tego.
Steve,
8
Masz pojęcie, jaka jest różnica między getResourceEntryName(int resid)i getResourceName(int resid)?
Joshua Pinter
10
@JoshPinter odniesienie mówi: getResourceEntryName: Zwróć nazwę wpisu dla podanego identyfikatora zasobu getResourceName: Zwróć pełną nazwę dla podanego identyfikatora zasobu. Nazwa ta jest pojedynczy łańcuch postaci „pakietu: typ / entry” Różnica wtedy wydaje się być w dodatku opakowaniu: typ dla getResourceName
Jose_GD
@Shubhayu - jak możesz to zrobić w teście espresso? Wydaje się, że funkcja getResources () nie jest dostępna!
1ak31sha
Nie polecałbym go używać, jeśli używasz Proguard ( minifyEnabled true), szczególnie dlagetResources().getIdentifier(...
25
9

Masz id (typ 'long') z tego identyfikatora, do którego chcesz uzyskać dostęp do identyfikatora przycisku radiowego (nazwa) , czyli radio1 . Używasz tego

getResources().getResourceEntryName(id);

Używając powyżej, możesz uzyskać nazwę przycisku radiowego, tj. radio1. tutaj id parametru to, który masz (typ długi) . Spróbuj tego, to pomoże ci w 100%.

Anil Jadhav
źródło
2
Dziękuję Ci. Cieszę się, że ktoś faktycznie odpowiedział na pytanie zamiast zwykłych odpowiedzi „po co ci [noob]”. Posiadanie nazwy elementu podczas iteracji przez nie jest NIEWAŻNE do debugowania. Naprawdę, jak mam znaleźć TextView o identyfikatorze 354814715? (co, jeśli się nie mylę, nie jest nawet stałe między kompilacjami) - nie jestem pewien, dlaczego OP tego potrzebował, ale potrzebowałem tego, aby sprawdzić, czy moja funkcja skalowania czcionek faktycznie iteruje, chociaż wszystkie elementy podrzędne.
Steve,
2

Kotlin:

val name = v.context.resources.getResourceEntryName(v.id)
Anand Makwana
źródło
2
Może mógłbyś dodać więcej informacji o tym, jaki problem rozwiązuje i jak to robi :)
Philipp Meissner
@PhilippMeissner to wszystko jest oczywiste
Jemshit Iskenderov
Zgódźmy się na niezgodę.
Philipp Meissner,
1

Jeśli mam rację, chciałeś odzyskać słowo "radio1" (z samego id?), Więc jeśli tak jest, to najpierw musisz uzyskać jego identyfikator.

int intname= buttonname.getId();

a następnie uzyskaj wynik

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

Miałem nadzieję, że pomogłem

Fahad Maqsood Qazi
źródło
-1

Masz na myśli, że chcesz wziąć tekst będący ciągiem identyfikatora?

Skoro już to zdefiniowałeś, powinieneś wiedzieć, co to jest.

Jeśli masz układ i chcesz sprawdzić, czy widok ma określony identyfikator, możesz przejść przez cały układ i sprawdzić za pomocą getId (), czy identyfikator każdego widoku jest identyfikatorem, którego szukasz.

Mam nadzieję, że to pomoże (jeśli rozumiem, popraw swoje pytanie .. :))

Dimitris Makris
źródło
Nie, wszystko źle zrozumiałeś. Chcę pobrać tekst radio1 z Androida: id = "@ + id / radio1"
Code_Life
Text radio1 to identyfikator Twojego widoku. Nie jest to prosty tekst, który można otrzymać, podzielić itp. Aby lepiej Ci pomóc, czy możesz nam powiedzieć, do czego dokładnie potrzebujesz tego tekstu?
Dimitris Makris
@DimitrisMakris: To długa historia .. Muszę wprowadzić dane do dużej liczby editText z niektórych danych otrzymanych z serwera. Więc zamiast ręcznie ustawiać dane we wszystkich polach tekstowych, piszę metodę, która może to zadziałać dla mnie ... do tego potrzebuję tego
Code_Life
Więc jeśli masz odpowiedź 10, na przykład ciągów, którymi chcesz zapełnić 10 przycisków radiowych, myślę, że rozwiązaniem może być dynamiczne utworzenie tych przycisków radiowych i ustawienie ich wartości. Innym podejściem mogłoby być użycie ListView z przyciskami radiowymi jako elementami listy, jeśli oczywiście odpowiada to Twoim potrzebom dotyczącym układu.
Dimitris Makris
Dziękuję za odpowiedź. Ale u mnie wszystko źle, mam 10 editBox i otrzymuję jako ciąg json z wartością do wypełnienia w tych 10 editbox po tym, jak ten ciąg jest parserd, jest konwertowany na HashMap. Teraz zamiast ręcznie mapować każdą wartość (odpowiadającą kluczowi hashmap) do tekstu editText .. Piszę metodę, która może to zadziałać dla mnie.
Code_Life