La dimensione del carattere di TextView nell'applicazione Android cambia quando si cambia la dimensione del carattere dalle impostazioni native


172

Voglio specificare la mia dimensione del testo nella mia applicazione, ma sto riscontrando problemi a farlo.

Quando cambio la dimensione del carattere nelle impostazioni del dispositivo, TextViewcambia anche la dimensione del carattere della mia applicazione .


2
è un comportamento predefinito che se si modifica la dimensione del carattere nativo del dispositivo, si ripercuotono anche sulla dimensione del carattere dell'applicazione.
Shreyash Mahajan

si possono trovare risposta da qui stackoverflow.com/questions/16706076/...
Bhavesh Jethani

Usa sp per la dimensione del testo ... perché, ma è ridimensionato dalla preferenza della dimensione del carattere dell'utente. Usa dp per tutto il resto.
live-love il

Risposte:


232

In realtà, le impostazioni dei font dimensioni influisce dimensioni solo in sp. Quindi tutto ciò che devi fare è definiretextSize nel dpposto disp , quindi le impostazioni non cambieranno la dimensione del testo nella vostra applicazione.

Ecco un link alla documentazione: Dimensioni

Tuttavia, tieni presente che il comportamento previsto è che i caratteri in tutte le app rispettino le preferenze dell'utente. Ci sono molte ragioni per cui un utente potrebbe voler regolare le dimensioni del carattere e alcune potrebbero anche essere utenti con problemi di vista. L'uso al dpposto di spper il testo potrebbe portare a discriminare involontariamente alcuni utenti della tua app.

vale a dire:

android:textSize="32dp"

12
Molto tempo fa volevo sapere se c'erano delle regole per quando dovrei usare spe quando dovrei usare dp. Ho avuto un'ottima risposta qui: stackoverflow.com/questions/11638691/…
Sam

129

Il modo più semplice per farlo è semplicemente usare qualcosa di simile al seguente:

android:textSize="32sp"

Se desideri saperne di più sulla textSizeproprietà, puoi consultare la documentazione per sviluppatori Android .


1
questo è in realtà il motivo per cui il TS ha il problema, usando 'sp' invece di 'dp'
Boy

8
Non so ancora perché ci siano 100 voti. perché se usiamo sp per impostare textize nell'applicazione. Quindi cambiamo la dimensione del carattere in Setting, anche il TextView nell'applicazione cambia
Phan Van Linh,

come risponde alla domanda?
Siddarth G

48

Usa il dimensiontipo di risorse come le tuestring risorse ( DOCS ).

Nel tuo dimens.xmlfile, dichiara le variabili di dimensione:

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

Quindi è possibile utilizzare questi valori in questo modo:

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

Puoi dichiarare diverso dimens.xml file diversi per diversi tipi di schermate. In questo modo garantirai l'aspetto desiderato della tua app su diversi dispositivi.

Quando non si specifica android:textSizeil sistema utilizza i valori predefiniti.


1
il problema non è schermate. È la dimensione del carattere nativo selezionata nelle impostazioni di visualizzazione Android che porta al problema menzionato
Himanshu Virmani,

24

Si noti inoltre che se textSize è impostato nel codice, chiamando textView.setTextSize(X)interpreta il numero (X) come SP. Utilizzare setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)per impostare i valori in dp .


13

Non è consigliabile specificare nuovamente DIP o SP per codice quando sono già definiti in un file dimen.xml.

Penso che l'opzione migliore sia usare PX quando si usa un valore dimen.xml:

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

In questo modo, è possibile passare da DP a SP se necessario nel file dimen.xml senza dover modificare alcun codice.


6

Un modo semplice per impedire che l'intera app venga influenzata dalla dimensione del font di sistema è aggiornareConfiguration usando un'attività di base.

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

1

questo può aiutare. aggiungi il codice nella tua Applicazione o BaseActivity personalizzata

/**
 * 重写 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;
}

tuttavia, Resource # updateConfiguration viene spiegato nel livello API 25, il che significa che in futuro non sarà più supportato.


1

Puoi usare questo codice:

android:textSize="32dp"

risolve il problema ma devi sapere che devi rispettare le decisioni degli utenti. in questo modo, la modifica della dimensione del testo dalle impostazioni del dispositivo non cambierà questo valore. quindi è per questo che devi usare sp invece di dp . Quindi il mio suggerimento è di rivedere la tua app con dimensioni dei caratteri di sistema diverse (piccola, normale, grande, ...)



1

cambiare DP in sp è buona pratica per Android Android: textSize = "18sp"


0

Se le unità utilizzate sono SP, non DP e si desidera sovrascrivere il ridimensionamento dei caratteri di sistema, è sufficiente ignorare un metodo nell'attività: vedere questo post .

resources.updateConfiguration è obsoleto e difettoso (su Oreo ho avuto problemi con il testo formattato).


0

Oltrepassare getResources() in attività.

Imposta le dimensioni di TextView in sp come al solito android:textSize="32sp"

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

0

in Android 8 questa soluzione funziona per me

aggiungi questo codice nell'attività di base

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.