studio plain example español edittext android textview

android - plain - TextView.setTextSize se comporta de forma anómala: cómo configurar el tamaño de texto de la vista de texto de forma dinámica para diferentes pantallas



textview html (6)

Llamar a TextView.setTextSize() funciona de forma anormal. Inmediatamente después de la llamada a setTextSize si obtenemos getTextSize devuelve un valor mucho más alto que el que configuramos anteriormente.

Esto es lo que estamos haciendo:

zoomControl.setOnZoomInClickListener(new OnClickListener() { public void onClick(View view) { float size = mViewShabad.getTextSize() + 1; textView.setTextSize(size); } });

¿Alguien ha visto esto antes?


Agregando un sabor extra para esta respuesta, ya que también se topó con un poco de confusión. Debería poder colocar esta prueba en cualquier prueba @RunWith(AndroidJUnit4.class) que tenga en su proyecto (también deberá agregar la dimensión a su dimensión.xml).

Nota: todas estas pruebas pasan

@Test public void testScaledFontSizes() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { final Context context = InstrumentationRegistry.getTargetContext(); Configuration configuration = context.getResources().getConfiguration(); configuration.fontScale = 2.0f; configuration.densityDpi = 160; // mdpi, 1:1 context.getResources().updateConfiguration(configuration, null); float scaledTextSize = context.getResources().getDimensionPixelSize(R.dimen.sp_15); assertEquals(30.0f, scaledTextSize); // Create a new TextView with the explicitly set configuration TextView textView = new TextView(context); textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledTextSize); // 30, because font size is scaled assertEquals(30.0f, textView.getTextSize()); // This is what we *don''t* want, it''s scaled *twice*! textView.setTextSize(scaledTextSize); assertEquals(60.0f, textView.getTextSize()); // DP instead of SP tests float fifteenDp = context.getResources().getDimensionPixelSize(R.dimen.dp_15); assertEquals(15.0f, fifteenDp); textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fifteenDp); // Still 15, because it''s DP, not SP assertEquals(15.0f, fifteenDp); textView.setTextSize(fifteenDp); // 30, because setTextSize DOES font scaling assertEquals(30.0f, textView.getTextSize()); } }

El gran TextView.setTextSize(float) que encontré es que TextView.setTextSize(float) aplica la escala de la fuente , por lo que si transfiere una dimensión que ya está etiquetada como SP en lugar de DP, recibirá la escala de la fuente dos veces .


Cuando intentamos establecerTexto () programado problema con getTextSize (), devuelve valor en px en lugar de sp / dp / dip y sabemos 1sp / dp = 1.5px (tamaño de pantalla = 240).

titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f));

me funciona a la perfección o podemos usar displaymatrix a px: sp / dp y luego reemplazar ese valor con 1.5f

means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));


En resumen, si quieres alejar tu tamaño de texto

float size = mViewShabad.getTextSize()*1.1f; textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);

Debido a que getTextSize () devuelve UNIT_PX, entonces debemos usar UNIT_PX


La diferencia aquí es que en el setTextSize(int size) , el tipo de unidad por defecto es "sp" o "píxeles escalados". Este valor será una dimensión de píxel diferente para cada densidad de pantalla (ldpi, mdpi, hdpi).

getTextSize() , por otro lado, devuelve las dimensiones de píxeles reales del texto.

Puede usar setTextSize(int unit, float size) para especificar un tipo de unidad. Los valores constantes para esto se pueden encontrar en la clase TypedValue, pero algunos de ellos son:

TypedValue.COMPLEX_UNIT_PX //Pixels TypedValue.COMPLEX_UNIT_SP //Scaled Pixels TypedValue.COMPLEX_UNIT_DIP //Device Independent Pixels


este problema ocurrió porque el método getTextSize() devuelve el tamaño en píxeles ¡depende de la densidad de la pantalla! para obtener el tamaño real de texto, usa esto:

DisplayMetrics metrics; metrics = getApplicationContext().getResources().getDisplayMetrics(); float Textsize =myTextView.getTextSize()/metrics.density; myTextView.setTextSize(Textsize+1);

espero que lo resuelva :)


si la configuración cambia el tamaño de la fuente, algo causa la demostración del error, puede hacer lo siguiente:

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);