studio - Android: ¿Cómo obtengo una cadena de recursos usando su nombre?
change name activity android (11)
Me gustaría tener 2 idiomas para la interfaz de usuario y valores de cadena separados para ellos en mi archivo de recursos res/values/strings.xml
:
<string name="tab_Books_en">Books</string>
<string name="tab_Quotes_en">Quotes</string>
<string name="tab_Questions_en">Questions</string>
<string name="tab_Notes_en">Notes</string>
<string name="tab_Bookmarks_en">Bookmarks</string>
<string name="tab_Books_ru">Книги</string>
<string name="tab_Quotes_ru">Цитаты</string>
<string name="tab_Questions_ru">Вопросы</string>
<string name="tab_Notes_ru">Заметки</string>
<string name="tab_Bookmarks_ru">Закладки</string>
Ahora necesito recuperar estos valores dinámicamente en mi aplicación:
spec.setContent(R.id.tabPage1);
String pack = getPackageName();
String id = "tab_Books_" + Central.lang;
int i = Central.Res.getIdentifier(id, "string", pack);
String str = Central.Res.getString(i);
Mi problema es que i = 0
.
¿Por qué no funciona en mi caso?
El mejor enfoque único
App.getRes().getString(R.string.some_id)
Esto funcionará en todas partes en la aplicación.
He leído todas las respuestas, todas las respuestas pueden hacer su trabajo.
- Puede usar
getString(R.string.some_string_id)
enActivity
oFragment
. - Puede usar
Context.getString(R.string.some_string_id)
donde no tiene acceso directo al métodogetString()
. ComoDialog
Problema
Cuando no tiene acceso de Context
, como un método en su clase Util
.
Supongamos el siguiente método sin contexto.
public void someMethod(){
...
// can''t use getResource() or getString() without Context.
}
Ahora pasará Context
como parámetro en este método y usará getString().
public void someMethod(Context context){
...
context.getString(R.string.some_id);
}
Lo que hago es
public void someMethod(){
...
App.getRes().getString(R.string.some_id)
}
¿Qué? ¡Es muy simple de usar en cualquier parte de tu aplicación!
Así que aquí hay una solución exclusiva de Bonus mediante la cual puede acceder a recursos desde cualquier lugar como la Util class
.
import android.app.Application;
import android.content.res.Resources;
public class App extends Application {
private static App mInstance;
private static Resources res;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
res = getResources();
}
public static App getInstance() {
return mInstance;
}
public static Resources getResourses() {
return res;
}
}
Agregue el campo de nombre a su manifest.xml
<application
etiqueta de <application
.
<application
android:name=".App"
...
>
...
</application>
Ahora eres bueno para irte. Use App.getRes().getString(R.string.some_id)
en cualquier lugar de la aplicación.
El enlace al que se refiere parece funcionar con cadenas generadas en tiempo de ejecución. Las cadenas de strings.xml no se crean en tiempo de ejecución. Puedes conseguirlos a través de
String mystring = getResources().getString(R.string.mystring);
getResources()
es un método de la clase de Context
. Si está dentro de una Activity
o un Service
(que extienden el Contexto) puede usarlo como en este fragmento de código.
También tenga en cuenta que toda la dependencia del lenguaje puede ser atendida por el marco de android . Simplemente crea diferentes carpetas para cada idioma. Si el inglés es su idioma predeterminado, simplemente coloque las cadenas en inglés en res/values/strings.xml
. Luego cree una nueva carpeta values-ru
y ponga las cadenas rusas con nombres idénticos en res/values-ru/strings.xml
. Desde este punto, Android selecciona la correcta según la configuración regional del dispositivo, ya sea cuando llames a getString()
o cuando @string/mystring
referencia a cadenas en XML a través de @string/mystring
. Los de res/values/strings.xml
son los de reserva, si no tiene una carpeta que cubra la configuración regional de los usuarios, esta se usará como valores predeterminados.
Consulte Localization y recursos para obtener más información.
La forma más sencilla es utilizar la función getString()
dentro de la actividad.
String myString = getString(R.string.mystring);
Referencia: http://developer.android.com/guide/topics/resources/string-resource.html
Creo que esta característica se agregó en una versión reciente de Android, cualquiera que conozca la historia puede comentar sobre esto.
Me gustaría agregar algo a la solución de leonvian, por lo que si por casualidad la cadena no se encuentra entre los recursos (valor de retorno 0, que no es un código de recurso válido), la función podría devolver algo:
private String getStringResourceByName(String aString) {
String packageName = getPackageName();
int resId = getResources()
.getIdentifier(aString, "string", packageName);
if (resId == 0) {
return aString;
} else {
return getString(resId);
}
}
No solo de actividades:
public static String byIdName(Context context, String name) {
Resources res = context.getResources();
return res.getString(res.getIdentifier(name, "string", context.getPackageName()));
}
Si no tiene una referencia de actividad, puede usar su contexto de esta manera:
getContext().getString(R.string.your_string_name);
String myString = getString (R.string.mystring);
forma fácil
También hay un conjunto de cadenas de Android predefinidas como "Ok", "Cancel" y muchas otras, para que no tenga que declarar todo. Están disponibles simplemente por:
getString(android.R.string.ok)
(En este caso, "Ok" cadena). Por cierto, también hay otros recursos de Android disponibles como, por ejemplo, imágenes de iconos, etc.
Tengo el mismo problema. Pero este código a continuación funciona para mí: verifique si su nombre de paquete es correcto. Tienes que referirte al paquete raíz de tu aplicación de Android.
private String getStringResourceByName(String aString) {
String packageName = getPackageName();
int resId = getResources().getIdentifier(aString, "string", packageName);
return getString(resId);
}
Una forma sencilla de obtener una cadena de recursos de una cadena en un TextView. Aquí resourceName es el nombre del recurso
int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))