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 textSize
te definiëren in dp
in 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 dp
in plaats van sp
voor 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 dimension
type bronnen zoals u gebruikt string
bronnen (docs ).
In uw dimens.xml
bestand, 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.xml
bestanden declareren voor verschillende soorten schermen.
Dit doen garandeert u de gewenste uitstraling van uw app op verschillende apparaten.
Wanneer u niet opgeeft android:textSize
Het 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>