Android TextView: "No concatenar texto mostrado con setText"


Estoy configurando texto usando setText() siguiendo el camino.

prodNameView.setText("" + name);

prodOriginalPriceView.setText("" + String.format(getString(R.string.string_product_rate_with_ruppe_sign), "" + new BigDecimal(price).setScale(2, RoundingMode.UP)));

En ese Primero uno es un uso simple y Segundo uno está configurando el texto con el texto de formato.

Android Studio es muy interesante, usé Menú Analyze -> Code Cleanup y tengo una sugerencia sobre dos líneas como.

introduzca la descripción de la imagen aquí

No concatenar texto mostrado con setText. Usar cadena de recursos con marcadores de posición. menos... (Ctrl+F1)

Cuando llamando a TextView#setText:

  • Nunca llame a Number#toString() para formatear números; no manejará separadores de fracciones y dígitos específicos de la configuración regional correctamente. Considerar usando el formato String#con las especificaciones de formato adecuadas (%d o % f) en su lugar.
  • No pase un literal de cadena (por ejemplo, "Hola") para mostrar texto. El texto codificado no se puede traducir correctamente a otros idiomas. Considera usar cadenas de recursos de Android en su lugar.
  • no construir mensajes concatenando fragmentos de texto. Tales mensajes no pueden ser traducidos correctamente.

¿Qué puedo hacer por esto? ¿Alguien puede ayudar a explicar qué es la cosa y qué debo hacer?

Author: Pratik Butani, 2015-10-16

6 answers

El recurso tiene la versión get overloaded de getString que toma un varargs de tipo Object: getString (int, java.lang.Objeto...). Si configura correctamente su cadena en cadenas.xml, con los titulares de posición correctos, puede usar esta versión para recuperar la versión formateada de su cadena final. Por ejemplo,

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

Usando getString(R.string.welcome_message, "Test", 0);

Android devolverá una cadena con

 Hello Test! you have 0 new messages

Acerca de setText("" + name);

Su primer ejemplo, prodNameView.setText("" + name); no tiene ningún sentido para me. TextView es capaz de manejar valores nulos. Si name es null, no se dibujará ningún texto.

 204
Author: Blackbelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-16 08:00:53

No se confunde con %1$s y %2$d en respuesta.Aquí hay algunas informaciones adicionales.

  • Los especificadores de formato pueden ser de la siguiente sintaxis:

%[argument_index$]format_specifier

  1. El opcional argument_index se especifica como un número que termina con un " % "después del" % " y selecciona el argumento especificado en la lista de argumentos. El primer argumento es referenciado por "1$", el segundo por "2$", etc.
  2. El especificador de formato requerido es un carácter que indica cómo se debe formatear el argumento. El conjunto de conversiones válidas para un argumento dado depende del tipo de datos del argumento.

Ejemplo

Crearemos la siguiente cadena formateada donde las partes grises se insertan programáticamente.

Hola Test! tienes 0 nuevos mensajes

Su string resource:

Hello, %1$s! Usted tiene %2$d nuevo mensajes

Haga el string substitution como se indica a continuación:

GetString (R. string.mensaje de bienvenida, "Test", 0);

Nota:

  • %1 s s subtitulará por la cadena "Test"
  • %2 d d subtitulará por la cadena " 0 "
 10
Author: Rissmon Suresh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-19 17:53:09

Me encontré con el mismo mensaje de error de pelusa y lo resolví de esta manera.

Inicialmente mi código era:

private void displayQuantity(int quantity) {
    TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
    quantityTextView.setText("" + quantity);
}

Tengo el siguiente error

Do not concatenate text displayed with setText. Use resource string with placeholders.

Entonces, agregué esto a strings.xml

<string name="blank">%d</string>

Que es mi inicial "" + un marcador de posición para mi número(cantidad).

Nota : Mi variable quantity estaba definida previamente y es lo que quería añadir a la cadena. Mi código como resultado fue

private void displayQuantity(int quantity) {
    TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
    quantityTextView.setText(getString(R.string.blank, quantity));
}

Después de esto, mi error desapareció. El comportamiento en la aplicación no cambio y mi cantidad continuó mostrándose como quería ahora sin un error de pelusa.

 10
Author: user1580203,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-22 10:34:02

Usted debe comprobar este hilo y utilizar un marcador de posición como el suyo (no probado)

<string name="string_product_rate_with_ruppe_sign">Price : %1$d</string>

String text = String.format(getString(R.string.string_product_rate_with_ruppe_sign),new BigDecimal(price).setScale(2, RoundingMode.UP));
prodOriginalPriceView.setText(text);
 6
Author: ThomasThiebaud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:26

El problema se debe a que está añadiendo "" al principio de cada cadena.

Lint escaneará los argumentos que se pasan a setText y generará advertencias, en su caso la siguiente advertencia es relevante:

No construir mensajes por concatenar fragmentos de texto. Tales mensajes no pueden ser correctamente traducido.

Mientras concatenas cada cadena con "".

Elimine esta concatenación ya que los argumentos que está pasando ya son texto. Además, puede usar .toString() si es necesario en cualquier otro lugar en lugar de concatenar su cadena con ""

 2
Author: Rahul Tiwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-16 08:02:00

No concatene texto dentro de su método setText(), Concatene lo que quiera en una cadena y coloque ese valor de cadena dentro de su método setText().

Ex: camino correcto

int min = 120;
int sec = 200;
int hrs = 2;

String minutes = String.format("%02d", mins);
            String seconds = String.format("%02d", secs);
            String newTime = hrs+":"+minutes+":"+seconds;

text.setText(minutes);

Do not concatenate inside setText () like

text.setText(hrs+":"+String.format("%02d", mins)+":"+String.format("%02d", secs));
 0
Author: Ashana.Jackol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-10 05:39:58