programacion - manual de android en pdf
Android, obteniendo el ID de recurso de la cadena? (13)
Necesito pasar una identificación de recurso a un método en una de mis clases. Necesita usar tanto la identificación a la que apunta la referencia como también la cadena. ¿Cómo debería lograr esto?
Por ejemplo:
R.drawable.icon
Necesito obtener el ID entero de esto, pero también necesito acceder al "ícono" de la cadena.
Sería preferible si todo lo que tenía que pasar al método fuera la cadena del "icono".
Una forma simple de obtener ID de recurso de la cadena. Aquí resourceName es el nombre del recurso ImageView en una carpeta dibujable que también se incluye en el archivo XML.
int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
ImageView im = (ImageView) findViewById(resID);
Context context = im.getContext();
int id = context.getResources().getIdentifier(resourceName, "drawable",
context.getPackageName());
im.setImageResource(id);
@EboMike: no sabía que existiera Resources.getIdentifier()
.
En mis proyectos usé el siguiente código para hacer eso:
public static int getResId(String resName, Class<?> c) {
try {
Field idField = c.getDeclaredField(resName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
Se usaría así:
getResId("icon", Drawable.class);
Acabo de encontrar una publicación de blog que dice que Resources.getIdentifier()
es más lento que usar reflection como lo hice. Compruébalo .
Cómo obtener un ID de recurso de la aplicación del nombre del recurso es una pregunta bastante común y bien respondida.
Cómo obtener un ID de recursos nativo de Android desde el nombre del recurso no está bien respondido. Aquí está mi solución para obtener un recurso dibujable de Android por nombre de recurso:
public static Drawable getAndroidDrawable(String pDrawableName){
int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "android");
if(resourceId==0){
return null;
} else {
return Resources.getSystem().getDrawable(resourceId);
}
}
El método se puede modificar para acceder a otros tipos de recursos.
Como dijiste que solo querías pasar un parámetro y no parecía importar cuál, podrías pasar el identificador del recurso y luego encontrar el nombre de la cadena para él, así:
String name = getResources().getResourceEntryName(id);
Esta podría ser la forma más eficiente de obtener ambos valores. No tiene que perder el tiempo buscando la parte del "icono" de una cadena más larga.
En MonoDroid / Xamarin.Android puedes hacer:
var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName);
Pero como GetIdentifier no se recomienda en Android, puede usar Reflection de esta manera:
var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null);
donde le sugiero que pruebe / atrape o verifique las cadenas que está pasando.
En su res / layout / my_image_layout.xml
<LinearLayout ...>
<ImageView
android:id="@+id/row_0_col_7"
...>
</ImageView>
</LinearLayout>
Para tomar ese ImageView por su valor @ + id, dentro de su código java haga esto:
String row = "0";
String column= "7";
String tileID = "row_" + (row) + "_col_" + (column);
ImageView image = (ImageView) activity.findViewById(activity.getResources()
.getIdentifier(tileID, "id", activity.getPackageName()));
/*Bottom code changes that ImageView to a different image. "blank" (R.mipmap.blank) is the name of an image I have in my drawable folder. */
image.setImageResource(R.mipmap.blank);
Me gustó esto, me funciona:
imageView.setImageResource(context.getResources().
getIdentifier("drawable/apple", null, context.getPackageName()));
Para obtener ID extraíble del nombre del recurso Cadena, estoy usando este código:
private int getResId(String resName) {
int defId = -1;
try {
Field f = R.drawable.class.getDeclaredField(resName);
Field def = R.drawable.class.getDeclaredField("transparent_flag");
defId = def.getInt(null);
return f.getInt(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
return defId;
}
}
Puede usar Resources.getIdentifier()
, aunque necesita usar el formato de su cadena como la usa en sus archivos XML, es decir, package:drawable/icon
.
Puede usar esta función para obtener el ID del recurso.
public static int getResourceId(String pVariableName, String pResourcename, String pPackageName)
{
try {
return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
Entonces, si quieres obtener una función de llamada dibuja como esta
getResourceId("myIcon", "drawable", getPackageName());
y para la cadena puedes llamarlo así
getResourceId("myAppName", "string", getPackageName());
Si necesita emparejar una cadena y un int, ¿qué tal un mapa?
static Map<String, Integer> icons = new HashMap<String, Integer>();
static {
icons.add("icon1", R.drawable.icon);
icons.add("icon2", R.drawable.othericon);
icons.add("someicon", R.drawable.whatever);
}
Esto se basa en la respuesta @Macarse.
Úselo para obtener Id de recursos de una manera más rápida y amigable.
public static int getId(String resourceName, Class<?> c) {
try {
Field idField = c.getDeclaredField(resourceName);
return idField.getInt(idField);
} catch (Exception e) {
throw new RuntimeException("No resource ID found for: "
+ resourceName + " / " + c, e);
}
}
Ejemplo:
getId("icon", R.drawable.class);
public int getDrawableName(Context ctx,String str){
return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());
}