Lettergrootte van TextView in Android-applicatie verandert bij het wijzigen van de lettergrootte vanuit de oorspronkelijke instellingen

Ik wil mijn eigen tekstgrootte specificeren in mijn toepassing, maar ik heb een probleem om dit te doen.

Als ik de lettergrootte in de apparaatinstellingen wijzig, verandert ook de lettergrootte van mijn applicatie TextView.


Antwoord 1, autoriteit 100%

Eigenlijk is de lettergrootte van Instellingen alleen van invloed op de grootte in sp. U hoeft dus alleen maar textSizete definiëren in dpin plaats van sp, dan veranderen de instellingen de tekstgrootte in uw app niet.

Hier is een link naar de documentatie: Afmetingen

Houd er echter rekening mee dat het verwachte gedrag is dat de lettertypen in alle apps de voorkeuren van de gebruiker respecteren. Er zijn veel redenen waarom een gebruiker de lettergrootte zou willen aanpassen en sommige kunnen zelfs medisch zijn – slechtziende gebruikers. Het gebruik van dpin plaats van spvoor tekst kan leiden tot ongewilde discriminatie van sommige gebruikers van uw app.

d.w.z.:

android:textSize="32dp"

Antwoord 2, autoriteit 52%

Het gemakkelijkste is om zoiets als het volgende te gebruiken:

android:textSize="32sp"

Als u meer wilt weten over de eigenschap textSize, kunt u de Documentatie voor Android-ontwikkelaars.


Antwoord 3, autoriteit 20%

Gebruik de dimensiontype bronnen zoals u gebruikt stringbronnen (docs ).

In uw dimens.xmlbestand, verklaar uw dimensievariabelen:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <dimen name="textview_height">25dp</dimen>
  <dimen name="textview_width">150dp</dimen>
  <dimen name="ball_radius">30dp</dimen>
  <dimen name="font_size">16sp</dimen>
</resources>

Dan kunt u deze waarden zoals deze gebruiken:

<TextView
   android:layout_height="@dimen/textview_height"
   android:layout_width="@dimen/textview_width"
   android:textSize="@dimen/font_size"/>

U kunt verschillende dimens.xmlbestanden declareren voor verschillende soorten schermen.
Dit doen garandeert u de gewenste uitstraling van uw app op verschillende apparaten.

Wanneer u niet opgeeft android:textSizeHet systeem gebruikt de standaardwaarden.


4, Autoriteit 6%

Het is niet goed om DIP of SP opnieuw op code te specificeren wanneer deze reeds is gedefinieerd in een Dimen.xml-bestand.

Ik denk dat de beste optie is om PX te gebruiken bij gebruik van een Dimen.XML-waarde:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));

Op deze manier kunt u indien nodig overschakelen van DP naar SP in het dimen.xml-bestand zonder enige code te hoeven wijzigen.


Antwoord 5, autoriteit 4%

Een eenvoudige manier om te voorkomen dat de hele app wordt beïnvloed door de lettergrootte van het systeem, is door Configuratie bij te werken met een basisactiviteit.

//in base activity add this code.
public  void adjustFontScale( Configuration configuration) {
    configuration.fontScale = (float) 1.0;
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(metrics);
    metrics.scaledDensity = configuration.fontScale * metrics.density;
    getBaseContext().getResources().updateConfiguration(configuration, metrics);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    adjustFontScale( getResources().getConfiguration());
}

Antwoord 6

deze oplossing is met Kotlin en zonder gebruik te maken van de verouderde functie resources.updateConfiguration

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        adjustFontScale(resources.configuration)
    }
    private fun adjustFontScale(configuration: Configuration?) {
        configuration?.let {
            it.fontScale = 1.0F
            val metrics: DisplayMetrics = resources.displayMetrics
            val wm: WindowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
            wm.defaultDisplay.getMetrics(metrics)
            metrics.scaledDensity = configuration.fontScale * metrics.density
            baseContext.applicationContext.createConfigurationContext(it)
            baseContext.resources.displayMetrics.setTo(metrics)
        }
    }

Observatie: dit is dezelfde oplossing als de hierbovenmaar geüpdatet met Kotlin


Antwoord 7

dit kan helpen. voeg de code toe aan uw aangepaste applicatie of BaseActivity

/**
 * 重写 getResource 方法,防止系统字体影响
 *
 * @return
 */
@Override
public Resources getResources() {
    Resources resources = super.getResources();
    if (resources != null && resources.getConfiguration().fontScale != 1) {
        Configuration configuration = resources.getConfiguration();
        configuration.fontScale = 1;
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    }
    return resources;
}

Resource#updateConfiguration is echter gedepliceerd in API-niveau 25, wat betekent dat het op een dag in de toekomst niet meer wordt ondersteund.


Antwoord 8

U kunt deze code gebruiken:

android:textSize="32dp"

het lost uw probleem op, maar u moet weten dat u gebruikersbeslissingen moet respecteren.
hierdoor verandert het wijzigen van de tekstgrootte van de apparaatinstellingen deze waarde niet. daarom moet je spgebruiken in plaats van dp.
Dus mijn suggestie is om je app te beoordelen met verschillende systeemlettergroottes (klein, normaal, groot,…)


Antwoord 9

voor kotlin werkt het voor mij

priceTextView.textSize = 12f

10

Wijzig de DP naar SP Het is een goede pratice voor Android
Android: Textsize = “18SP”


11

In Android 8 Deze oplossing werkt voor mij

Voeg deze code toe in basisactiviteit

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    final Configuration override = new Configuration(newBase.getResources().getConfiguration());
    override.fontScale = 1.0f;
    applyOverrideConfiguration(override);
}

Bron
https://stackoverflow.com/a/57225687/7985871


12

Als de gebruikte eenheden SP zijn, niet DP, en u wilt het systeem met de schaling van het systeem overschrijven, is alles wat u doet, een methode in activiteit – Zie deze post .

Bronnen.Updateconfiguratie is verouderd en buggy (op Oreo had ik problemen met opgemaakte tekst).


13

Overschrijven getResources()in activiteit.

De grootte van het tekstview in SP zoals gebruikelijk instellen zoals android:textSize="32sp"

override fun getResources(): Resources {
    return super.getResources().apply {
        configuration.fontScale = 1F
        updateConfiguration(configuration, displayMetrics)
    }
}

14

Ik verander meestal de grootte van Dimen in Resources Bestand

<resources>
    <dimen name="siez_1">40px</dimen>
    <dimen name="siez_2">50px</dimen>
    <dimen name="siez_3">60px</dimen>
</resources>

Other episodes