Muszę przekazać identyfikator zasobu do metody w jednej z moich klas. Musi używać zarówno identyfikatora, na który wskazuje odwołanie, jak i łańcucha. Jak najlepiej to osiągnąć?
Na przykład:
R.drawable.icon
Muszę uzyskać całkowity identyfikator tego, ale potrzebuję również dostępu do ciągu „ikona”.
Byłoby lepiej, gdyby wszystko, co musiałem przekazać do metody, to ciąg znaków „ikona”.
Odpowiedzi:
@EboMike: Nie wiedziałem, że
Resources.getIdentifier()
istnieje.W moich projektach wykorzystałem do tego następujący kod:
Zostałby użyty w ten sposób do uzyskania wartości wartości
R.drawable.icon
całkowitej zasobuWłaśnie znalazłem post na blogu, w którym napisano, że
Resources.getIdentifier()
jest to wolniejsze niż używanie refleksji, tak jak ja. Sprawdź to .źródło
getIdentifier()
musi przeprowadzić dwa wyszukiwania odbić. W powyższym przykładziegetIdentifier()
użyje odbicia, aby pobraćDrawable.class
, a następnie innego wyszukiwania odbicia, aby uzyskać identyfikator zasobu. To tłumaczyłoby różnicę prędkości. Biorąc to pod uwagę, żadne z nich nie są szczególnie szybkie i dlatego naprawdę muszą być buforowane (szczególnie jeśli są używane w pętli lub dla wierszy w aListView
). A dużym problemem podejścia opartego na refleksji jest to, że przyjmuje założenia dotyczące wewnętrznych elementów Androida, które mogą ulec zmianie w niektórych przyszłych wersjach.context
parametr?Możesz użyć tej funkcji, aby uzyskać identyfikator zasobu.
Więc jeśli chcesz uzyskać taką funkcję wywołania z możliwością rysowania
a dla string możesz to tak nazwać
Przeczytaj to
źródło
Jest to oparte na odpowiedzi @Macarse.
Użyj tego, aby uzyskać identyfikator zasobów w szybszy i bardziej przyjazny dla kodu sposób.
Przykład:
źródło
Jak uzyskać identyfikator zasobu aplikacji z nazwy zasobu, jest dość powszechnym pytaniem, na które udzielono odpowiedzi.
Odpowiedź na pytanie, jak uzyskać natywny identyfikator zasobu Androida z nazwy zasobu, jest gorsza. Oto moje rozwiązanie, aby uzyskać zasób do rysowania systemu Android według nazwy zasobu:
Metodę można zmodyfikować, aby uzyskać dostęp do innych typów zasobów.
źródło
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){ return mContext.getDrawable(resourceId); } else { return mContext.getResources().getDrawable(resourceId); }
Jeśli potrzebujesz sparować string i int, to co powiesz na Mapę?
źródło
Możesz użyć
Resources.getIdentifier()
, chociaż musisz użyć formatu swojego ciągu, ponieważ używasz go w plikach XML, tjpackage:drawable/icon
.źródło
getResourceEntryName(id)
aby znaleźć nazwę ciągu. Nie trzeba szukać „ikony” w dłuższym tekście.Tak mi się podobało, to działa dla mnie:
źródło
źródło
źródło
getIdentifier
musi byćid
. Nie było to nawet wspomniane na stronie programistów Androida. skąd masz te informacje?Ponieważ powiedziałeś, że chcesz przekazać tylko jeden parametr i wydawało się, że nie ma znaczenia który, możesz przekazać identyfikator zasobu, a następnie znaleźć nazwę ciągu, w ten sposób:
Może to być najbardziej efektywny sposób uzyskania obu wartości. Nie musisz martwić się znajdowaniem tylko części „ikony” z dłuższego ciągu.
źródło
W twoim res / layout / my_image_layout.xml
Aby pobrać ten ImageView przez jego wartość @ + id, w kodzie java wykonaj następujące czynności:
źródło
Podejście Kotlina
Stosowanie:
źródło
W MonoDroid / Xamarin.Android możesz:
Ale ponieważ GetIdentifier nie jest zalecany w Androidzie - możesz użyć Reflection w następujący sposób:
gdzie proponuję spróbować / złapać lub zweryfikować przekazywane ciągi.
źródło
Aby uzyskać identyfikator do rysowania z nazwy zasobu String, używam tego kodu:
źródło