Android uygulamasında TextView'in yazı tipi boyutu, yerel ayarlardan yazı tipi boyutunu değiştirmeye bağlı olarak değişir


172

Uygulamamda kendi metin boyutumu belirtmek istiyorum, ancak bunu yaparken bir sorun yaşıyorum.

Cihaz ayarlarında yazı tipi boyutunu değiştirdiğimde, uygulamamın yazı tipi boyutu TextViewda değişir.


2
cihazınızın yerel yazı tipinin yazı tipi boyutunu değiştirirseniz uygulamanın yazı tipi boyutuna da etki etmesi varsayılan davranıştır.
Shreyash Mahajan


Metin boyutu için sp kullanın… çünkü kullanıcının yazı tipi boyutu tercihine göre ölçeklendirilir. Diğer her şey için dp kullanın.
canlı aşk

Yanıtlar:


232

Aslında, Ayarlar yazı tipi boyutu yalnızca içindeki boyutları etkiler sp. Tanımlamak - tüm Yani sen yapmanız gereken textSizeiçinde dpyerine sp, daha sonra ayarları Kişisel uygulamasında kısa boyutunu değiştirmez.

Dokümanlara bir link: Boyutlar

Ancak, beklenen davranışın tüm uygulamalardaki yazı tiplerinin kullanıcının tercihlerine saygı duyması olduğunu lütfen unutmayın. Bir kullanıcının yazı tipi boyutlarını ayarlamak istemesinin birçok nedeni olabilir ve bazıları tıbbi - görme engelli kullanıcılar bile olabilir. Metin dpyerine kullanmak sp, uygulamanızın bazı kullanıcılarına isteksizce ayrımcılığa yol açabilir.

yani:

android:textSize="32dp"

12
Uzun zaman önce ne zaman kullanmam spve ne zaman kullanmam gerektiğine dair bir kural olup olmadığını bilmek istedim dp. Burada gerçekten iyi bir yanıt aldım: stackoverflow.com/questions/11638691/…
Sam

129

Bunu yapmanın en kolay yolu basitçe aşağıdaki gibi bir şey kullanmaktır:

android:textSize="32sp"

textSizeMülk hakkında daha fazla bilgi edinmek istiyorsanız Android geliştirici dokümanlarına bakabilirsiniz .


1
bu yüzden TS 'dp' yerine 'sp' kullanarak sorunu var
Boy

8
Neden hala 100 oy olduğunu bilmiyorum. çünkü uygulamada set metin boyutu için sp kullanırsak. Sonra Ayarlar'da yazı tipi boyutunu değiştiririz, uygulamadaki TextView de değişir
Phan Van Linh

bu soruya nasıl cevap veriyor?
Siddarth G

48

Kaynakları ( DOCS ) dimensionkullandığınız gibi kaynak türlerini kullanın .string

Senin içinde dimens.xmldosyanın, senin boyut değişkenleri bildirmek:

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

Sonra şu değerleri kullanabilirsiniz:

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

dimens.xmlFarklı ekran türleri için farklı dosyalar bildirebilirsiniz . Bunu yapmak uygulamanızın farklı cihazlarda istenen görünümünü garanti eder.

Belirtmediğinizde android:textSizesistem varsayılan değerleri kullanır.


1
sorun ekranlar değil. Söz konusu soruna yol açan android ekran ayarlarında seçilen yerel yazı tipi boyutu
Himanshu Virmani 21:13

24

Ayrıca, textSize kod olarak ayarlanmışsa, çağrının textView.setTextSize(X)(X) sayısını SP olarak yorumladığını unutmayın . setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)Değerleri dp olarak ayarlamak için kullanın .


13

Bir dimen.xml dosyasında önceden tanımlandığında DIP veya SP'yi kodla tekrar belirtmek iyi bir şey değildir.

En iyi seçenek bir dimen.xml değeri kullanırken PX kullanmak olduğunu düşünüyorum:

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

Bu şekilde, dimen.xml dosyasında gerekirse herhangi bir kodu değiştirmek zorunda kalmadan DP'den SP'ye geçebilirsiniz.


6

tüm uygulamanın sistem yazı tipi boyutundan etkilenmesini önlemenin basit bir yolu, bir temel etkinlik kullanarak yapılandırmayı güncellemektir.

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

bu yardımcı olabilir. kodu özel Uygulamanıza veya BaseActivity'ye ekleyin

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

ancak, Kaynak # updateConfiguration API düzeyi 25'te açıklanmıştır, bu da gelecekte bir gün desteklenmeyeceği anlamına gelir.


1

Bu kodu kullanabilirsiniz:

android:textSize="32dp"

sorununuzu çözer, ancak kullanıcı kararlarına uymanız gerektiğini bilmelisiniz. bu şekilde, metin boyutunu cihaz ayarlarından değiştirmek bu değeri değiştirmez. bu yüzden dp yerine sp kullanmanız gerekir . Bu yüzden önerim uygulamanızı farklı sistem yazı tipi boyutlarıyla (küçük, normal, büyük, ...) incelemektir.



1

DP android için iyi bir uygulama DP değiştirin: textSize = "18sp"


0

Kullanılan birimler DP değil SP ise ve sistem yazı tipi ölçeklendirmesini geçersiz kılmak istiyorsanız, tek yapmanız gereken etkinlikteki bir yöntemi geçersiz kılmaktır - bu gönderiye bakın .

resources.updateConfiguration kullanımdan kaldırıldı ve buggy (Oreo'da biçimlendirilmiş metinle ilgili sorunlar yaşadım).


0

getResources()Etkinlik'te geçersiz kıl .

TextView boyutunu sp olarak her zamanki gibi ayarlayın android:textSize="32sp"

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

0

android 8'de bu çözüm benim için çalışıyor

bu kodu temel etkinliğe ekle

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.