O tamanho da fonte do TextView no aplicativo Android muda ao alterar o tamanho da fonte nas configurações nativas


171

Quero especificar meu próprio tamanho de texto no meu aplicativo, mas estou tendo problemas para fazer isso.

Quando altero o tamanho da fonte nas configurações do dispositivo, o tamanho da fonte do meu aplicativo TextViewtambém muda.


2
é um comportamento padrão que, se você alterar o tamanho da fonte da fonte nativa do dispositivo, também afetará o tamanho da fonte do aplicativo.
Shreyash Mahajan 7/11

você pode encontrar respostas a partir daqui stackoverflow.com/questions/16706076/…
Bhavesh Jethani

Use sp para o tamanho do texto… porque é dimensionado pela preferência do tamanho da fonte do usuário. Use dp para todo o resto.
live-love

Respostas:


231

Na verdade, o tamanho da fonte Configurações afeta apenas tamanhos sp. Então, tudo que você precisa fazer - defina textSizeem dpvez desp e as configurações não mudarão o tamanho do texto no seu aplicativo.

Aqui está um link para a documentação: Dimensões

No entanto, observe que o comportamento esperado é que as fontes em todos os aplicativos respeitem as preferências do usuário. Há muitos motivos pelos quais um usuário pode querer ajustar o tamanho da fonte e alguns deles podem até ser usuários com deficiência visual. Usar em dpvez de sptexto pode levar a discriminação involuntária contra alguns dos usuários do seu aplicativo.

ou seja:

android:textSize="32dp"

12
Há muito tempo, queria saber se havia alguma regra sobre quando spe quando devo usar dp. Eu recebi uma resposta muito boa aqui: stackoverflow.com/questions/11638691/…
Sam

129

O mais fácil é simplesmente usar algo como o seguinte:

android:textSize="32sp"

Se você quiser saber mais sobre a textSizepropriedade, verifique a documentação do desenvolvedor do Android .


1
isso é realmente por que o TS tem o problema, usando 'sp' em vez de 'dp'
Boy

8
Ainda não sei por que existem 100 votos positivos. porque se usarmos sp para definir o tamanho do texto no aplicativo. Em seguida, mudar o tamanho da fonte na configuração, o TextView na aplicação também mudar
Phan Van Linh

como isso responde a pergunta?
Siddarth G 14/04

48

Use o dimensiontipo de recursos como você usa os stringrecursos ( DOCS ).

No seu dimens.xmlarquivo, declare suas variáveis ​​de dimensão:

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

Então você pode usar estes valores assim:

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

Você pode declarar diferentes dimens.xml arquivos diferentes para diferentes tipos de telas. Isso garantirá a aparência desejada do seu aplicativo em diferentes dispositivos.

Quando você não especifica, android:textSizeo sistema usa os valores padrão.


1
questão não é telas. É o tamanho da fonte nativa selecionada no configurações de exibição android que leva ao problema mencionado
Himanshu Virmani

24

Observe também que, se o textSize estiver definido no código, a chamada textView.setTextSize(X)interpretará o número (X) como SP. Use setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)para definir valores em dp .


13

Não é recomendável especificar DIP ou SP novamente por código, quando já definido em um arquivo dimen.xml.

Eu acho que a melhor opção é usar o PX ao usar um valor dimen.xml:

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

Dessa forma, você pode alternar do DP para o SP, se necessário, no arquivo dimen.xml, sem precisar alterar nenhum código.


6

Uma maneira simples de impedir que todo o aplicativo seja afetado pelo tamanho da fonte do sistema é atualizar a Configuração usando uma atividade 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

isso pode ajudar. adicione o código no seu Application ou BaseActivity personalizado

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

no entanto, o recurso # updateConfiguration é duplicado no nível 25 da API, o que significa que não será suportado algum dia no futuro.


1

Você pode usar este código:

android:textSize="32dp"

resolve o seu problema, mas você deve saber que deve respeitar as decisões do usuário. por isso, alterar o tamanho do texto nas configurações do dispositivo não altera esse valor. é por isso que você precisa usar sp em vez de dp . Portanto, minha sugestão é revisar seu aplicativo com diferentes tamanhos de fonte do sistema (pequeno, normal, grande, ...)



1

alterar o DP para sp é uma boa prática para android android: textSize = "18sp"


0

Se as unidades usadas são SP, não DP, e você deseja substituir o dimensionamento da fonte do sistema, tudo o que você faz é substituir um método em atividade - consulte esta postagem .

resources.updateConfiguration está obsoleto e com erros (no Oreo, tive problemas com o texto formatado).


0

Substituir getResources()na Atividade.

Defina o tamanho do TextView em sp como de costume, como android:textSize="32sp"

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

0

no android 8 esta solução funciona para mim

adicione este código na atividade 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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.