it-swarm.dev

Velikost písma TextView v aplikaci Android se mění při změně velikosti písma z nativního nastavení

Chci specifikovat vlastní velikost textu v aplikaci, ale mám problém s tím. 

Když změním velikost písma v nastavení zařízení, změní se také velikost fontu mé aplikace TextView.

140
VicJordan

Ve skutečnosti nastavení velikosti písma ovlivňuje pouze velikosti v sp. Takže vše Musíte udělat - definovat textSize v dp místo sp, pak nastavení nezmění velikost textu v aplikaci.

Zde je odkaz na dokumentaci: Dimenze

Všimněte si prosím, že očekávané chování je, že písma ve všech aplikacích respektují předvolby uživatele. Existuje mnoho důvodů, proč uživatel může chtít upravit velikost písma a některé z nich mohou být i zdravotně postižené. Použití dp namísto sp pro text může vést k nechtěné diskriminaci některých uživatelů vaší aplikace.

tj: 

Android:textSize="32dp"
192
sandrstar

Nejjednodušší je jednoduše použít něco jako:

Android:textSize="32sp"

Pokud se chcete dozvědět více o vlastnostech textSize, můžete zkontrolovat dokumentaci Android developer .

127
Evan Long

Použijte dimension typ prostředků, jako například string prostředky ( DOCS ).

V souboru dimens.xml deklarujte proměnné kóty:

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

Tyto hodnoty můžete použít takto:

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

Pro různé typy obrazovek můžete deklarovat různé soubory dimens.xml. Tímto způsobem zaručíte požadovaný vzhled aplikace na různých zařízeních.

Pokud nezadáte Android:textSize, systém použije výchozí hodnoty.

43
ashakirov

Všimněte si také, že pokud je textSize nastaven v kódu, volání textView.setTextSize(X) interpretuje číslo (X) jako SP. Použijte setTextSize(TypedValue.COMPLEX_UNIT_DIP, X) pro nastavení hodnot v dp

23
Arpit

Není dobré, když zadáte DIP nebo SP znovu kódem, pokud je již definován v souboru dimen.xml.

Myslím, že nejlepší možností je použít PX při použití hodnoty dimen.xml:

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

Tímto způsobem můžete přepnout z DP na SP v případě potřeby v souboru dimen.xml, aniž byste museli měnit jakýkoli kód.

12
mba

jednoduchý způsob, jak zabránit tomu, aby se celá aplikace dostala podle velikosti systémového písma, je updateConfiguration používající základní aktivitu.

//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());
}
4
Usama Saeed US

to může pomoci. přidat kód do vlastní aplikace nebo 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 je však v úrovni API 25, což znamená, že v budoucnu nebude podporován. 

1
Arno_J

Použití velikosti písma v DPs namísto SPs v textSize to vyřeší.

1
bpr10

Musíte psát tagy TextView v XML:

Android:textSize="32dp"
1
neha

Přepsat getResources() v Aktivitě.

Nastavit velikost TextView v sp jako obvykle, jako Android:textSize="32sp"

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

Pokud jsou použity jednotky SP, ne DP, a chcete přepsat systémovou změnu měřítka, vše, co musíte udělat, je přepsat jednu metodu v aktivitě - viz tento příspěvek .

resources.updateConfiguration je zastaralé a buggy (na Oreo jsem měl problémy s formátovaným textem).

0
Maxim Saplin

Tento kód můžete použít:

Android:textSize="32dp"

to vyřeší váš problém, ale musíte vědět, že byste měli respektovat rozhodnutí uživatele. tímto způsobem, změna velikosti textu z nastavení zařízení tuto hodnotu nezmění. tak to je důvod, proč je třeba použít sp místo dp . Takže můj návrh je zkontrolovat vaši aplikaci s různými velikostmi systémového písma (malé, normální, velké, ...)

0
Hossein Karami