webentwicklung-frage-antwort-db.com.de

TextView.setTextSize verhält sich nicht normal - Festlegen der Textgröße der Textansicht für verschiedene Bildschirme

Der Aufruf von TextView.setTextSize() funktioniert nicht ordnungsgemäß. Gleich nach dem Aufruf von setTextSize erhalten wir eine getTextSize, deren Wert einen viel höheren Wert zurückgibt als der, auf den wir ihn zuvor gesetzt haben. 

Folgendes tun wir:

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

Hat jemand das schon mal gesehen?

108
singhspk

Der Unterschied hier ist, dass in der setTextSize(int size)-Methode der Einheitentyp standardmäßig "sp" oder "skalierte Pixel" ist. Dieser Wert wird für jede Bildschirmdichte (ldpi, mdpi, hdpi) eine andere Pixelgröße sein. 

getTextSize() gibt dagegen die tatsächlichen Pixelabmessungen des Textes zurück.

Sie können setTextSize(int unit, float size) verwenden, um einen Einheitentyp anzugeben. Die konstanten Werte hierfür finden Sie in der TypedValue-Klasse. Einige davon sind jedoch:

TypedValue.COMPLEX_UNIT_PX   //Pixels

TypedValue.COMPLEX_UNIT_SP   //Scaled Pixels

TypedValue.COMPLEX_UNIT_DIP  //Device Independent Pixels
339
kcoppock

dieses Problem ist aufgetreten, da die getTextSize()-Methode die Größe in Pixel von der Bildschirmdichte abhängig macht! Um die aktuelle Textgröße zu erhalten, verwenden Sie Folgendes:

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

ich hoffe es löst es :)

15
M_AWADI

wenn die Einstellung die Schriftgröße ändert, kann dies zu folgenden Fehlern führen:

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
7

Wenn wir versuchen, programmgesteuert mit getTextSize () ein setText () zu setzen, wird der Wert in px anstelle von sp/dp/dip zurückgegeben, und wir kennen 1sp/dp = 1.5px (Bildschirmgröße = 240).

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

funktioniert perfekt für mich oder wir können displaymatrix zu px: sp/dp ratio verwenden und diesen Wert durch 1.5f ersetzen

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

Kurz gesagt, wenn Sie Ihre Textgröße verkleinern möchten

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

Da getTextSize () UNIT_PX zurückgibt, sollten wir UNIT_PX verwenden

2
Frank Nguyen

Das Hinzufügen von etwas mehr Geschmack für diese Antwort, als auch ein bisschen Verwirrung stieß. Sie sollten können diesen Test in jedem @RunWith(AndroidJUnit4.class) Test ablegen, den Sie in Ihrem Projekt haben (Sie müssen die Dimens auch zu Ihrer dimens.xml hinzufügen).

Hinweis: Alle diese Tests bestehen

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

Der große Vorteil, den ich gefunden habe, ist, dass TextView.setTextSize(float)wendet die Schriftskalierung an an. Wenn Sie also eine Abmessung eingeben, die bereits als SP anstelle von DP gekennzeichnet ist , dann erhält es die Schriftskalierung zweimal.

0
Kevin Grant

Nach langer Zeit schlug dies zu und löste sich schließlich so

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
          getResources().getDimension(R.dimen.textsize));

erstelle einen dimen Ordner wie diesen res/values ​​/ dimensions.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

 <dimen name="textsize">8sp</dimen>

 </resources>
0
NagarjunaReddy