android concatenation android-textview textview string-concatenation

Android TextView: "No concatene el texto que se muestra con setText"



concatenation android-textview (7)

Debe verificar este thread y usar 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);

Estoy configurando el texto usando setText () de la siguiente manera.

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

En eso, el primero es un uso simple y el segundo es configurar el texto con el formato del texto.

Android Studio es muy interesante, utilicé Menu Analyze -> Code Cleanup y recibí sugerencias en las dos líneas anteriores.

No concatene el texto que se muestra con setText. Use una cadena de recursos con marcadores de posición. menos ... (Ctrl + F1)

Al llamar a TextView # setText:

  • Nunca llame a Number # toString () para formatear números; no manejará separadores de fracciones y dígitos específicos de la localidad correctamente. Considere usar el formato String # con las especificaciones de formato adecuadas (% do% 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. Considere usar cadenas de recursos de Android en su lugar.
  • No cree mensajes concatenando fragmentos de texto. Dichos mensajes no se pueden traducir correctamente.

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


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); }

Tuve 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>

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

Nota : Mi variable de quantity se definió previamente y es lo que quería agregar 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 cambió y mi cantidad continuó mostrándose como quería ahora sin un error de pelusa.


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

Ej: forma correcta

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);

No concatene dentro de setText () como

text.setText(hrs+":"+String.format("%02d", mins)+":"+String.format("%02d", secs));


No se confunda con % 1 $ sy % 2 $ d en la respuesta aceptada. Aquí hay información adicional.

  • Los especificadores de formato pueden tener la siguiente sintaxis:

% [ argument_index $] format_specifier

  1. El argumento_índice opcional 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 está 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 mediante programación.

Hola Test tienes 0 mensajes nuevos

Su string resource :

<string name = "welcome_messages"> Hola, %1$s ! Tienes %2$d mensajes nuevos </ string>

Realice la string substitution la string substitution como se indica a continuación:

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

Nota:

  • % 1 $ s se sustituirá por la cadena "Prueba"
  • % 2 $ d se sustituirá por la cadena "0"

Resource tiene la versión de getString sobrecargada, que toma un varargs de tipo Object : getString (int, java.lang.Object ...) . Si configura correctamente su cadena en strings.xml, con los marcadores de posición correctos, puede usar esta versión para recuperar la versión formateada de su cadena final. P.ej

<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 mí. TextView puede manejar valores nulos. Si el nombre es nulo, no se dibujará ningún texto.


Si no necesita admitir i18n, puede deshabilitar esta comprobación de pelusas en Android Studio

Archivo -> Configuración -> Editor -> Inspecciones -> Android -> Lint -> TextView Internationalization (desmarque esto)


el problema es porque está agregando "" 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 cree mensajes concatenando fragmentos de texto. Dichos mensajes no se pueden traducir correctamente.

mientras concatena 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 ""