2009-12-31 17 views
53

Pensé que sería elegante y usaría el archivo string.xml para definir algunas cadenas constantes para cosas como mensajes de excepción. En strings.xml presioné Agregar, elegí la opción "Cadena" (no "Matriz de cadenas"), luego le di un nombre y un valor. Me sorprendió ver que este código no funciona:Eclipse/Java - Valores en R.string. * Return int?

throw new Exception(R.string.MyExceptionMessage); 

Y eso falla porque R.string.MyExceptionMessage en realidad es de tipo int. Puedo verificar ese tipo mirando en R.java. ¿Qué me estoy perdiendo?

Respuesta

100

Todo en la clase R es una referencia, por lo tanto, se define como int.

Si el código se ejecuta dentro — o tiene acceso a — un Android Context, puede llamar context.getString(R.string.my_exception_message) para obtener el valor real String.

O, para cosas como cadenas de excepción que no requieren traducción y por lo tanto no es estrictamente necesario definirlas en un archivo .xml de recursos de Android, puede almacenar las cadenas como constantes en algún tipo de interfaz StringConstants . De esta forma, puede consultar las cadenas desde las clases de utilidad que pueden no tener acceso al Context.

+8

Chris tiene razón en ambas cuentas. Context.getString carga su recurso de cadena. Pero ten cuidado de poner cosas no localizables allí ya que se mezclará con tus cadenas de traducción. No lo consideraría elegante, pero DEBE poner sus cadenas de interfaz de usuario en los archivos XML y no en el código. En cierto punto, querrá distribuir sus aplicaciones a otros países, y sacarlas del código requerirá un gran esfuerzo. Hazlo ahora y salva el dolor de cabeza. Tengo un distribuidor en China. Le envío las cadenas.xml para traducir, sin esfuerzo. Atentamente, el método Ari – BeMeCollective

5

Chris tiene razón. Pero, ¿qué sucede si también quieres localizar la cadena Exception? Por ejemplo, arrojas una excepción y cuando la atrapas quieres mostrar el mensaje de excepción al usuario. Me gustaría ponerlos en strings.xml pero al mismo tiempo no quiero utilizar este código

throw new Exception(context.getString(R.string.my_exception_message)) 

porque creo que si tienes una excepción, probablemente usted no quiere y se puede' Use un código adicional para obtener el mensaje de excepción.

creo que la única solución sería declarar una cadena estática de este mensaje en su actividad principal y inicializarlo tan pronto como sea posible (por ejemplo, en el método onCreate()) de esta manera:

private static String my_exception_message; 

public onCreate() 
{ 
    my_exception_message = context.getString(R.string.my_exception_message); 
} 

Entonces, cuando lanza la excepción, tiene su mensaje localizado listo para usar. ¿Qué opinas? ¿Puedes pensar en algunas otras soluciones?

29

Utilice el método "getResources(). GetString (id)".

getResources().getString(R.string.title_activity) 

Y boom, usted tiene su cadena. Asegúrese de guardar esa cadena en su archivo string.xml en la carpeta de valores.

+1

getResources() no siempre está disponible. –

+0

"no se puede resolver el método getResources" – moonvader