Ukuran font dari TextView dalam aplikasi Android berubah pada perubahan ukuran font dari pengaturan asli


172

Saya ingin menentukan ukuran teks saya sendiri di aplikasi saya, tetapi saya mengalami masalah melakukan ini.

Ketika saya mengubah ukuran font di pengaturan perangkat, ukuran font aplikasi saya TextViewjuga berubah.


2
itu adalah perilaku default bahwa jika Anda mengubah ukuran font dari font asli perangkat Anda, maka itu juga berpengaruh pada ukuran font aplikasi Anda.
Shreyash Mahajan

Anda dapat menemukan jawabannya dari sini stackoverflow.com/questions/16706076/…
Bhavesh Jethani

Gunakan sp untuk ukuran teks ... karena tetapi diskalakan oleh preferensi ukuran font pengguna. Gunakan dp untuk yang lainnya.
live-love

Jawaban:


232

Sebenarnya, ukuran font Pengaturan hanya memengaruhi ukuran dalam sp. Jadi semua Anda perlu melakukan - menentukan textSizedi dpbukan sp, maka pengaturan tidak akan mengubah ukuran teks dalam aplikasi Anda.

Berikut tautan ke dokumentasi: Dimensi

Namun harap dicatat bahwa perilaku yang diharapkan adalah font di semua aplikasi menghormati preferensi pengguna. Ada banyak alasan seorang pengguna mungkin ingin menyesuaikan ukuran font dan beberapa dari mereka bahkan mungkin pengguna yang tunanetra. Menggunakan dpalih-alih spuntuk teks dapat menyebabkan diskriminasi dengan enggan terhadap beberapa pengguna aplikasi Anda.

yaitu:

android:textSize="32dp"

12
Beberapa waktu yang lalu saya ingin tahu apakah ada aturan untuk kapan saya harus menggunakan spdan kapan saya harus menggunakannya dp. Saya mendapat respons yang sangat baik di sini: stackoverflow.com/questions/11638691/…
Sam

129

Cara termudah untuk melakukannya adalah dengan menggunakan sesuatu seperti berikut:

android:textSize="32sp"

Jika Anda ingin tahu lebih banyak tentang textSizeproperti ini, Anda dapat memeriksa dokumentasi pengembang Android .


1
inilah sebenarnya mengapa TS memiliki masalah, menggunakan 'sp' bukan 'dp'
Boy

8
Saya masih tidak tahu mengapa ada 100 upvotes. karena jika kita menggunakan sp untuk mengatur textsize di aplikasi. Kemudian kita mengubah ukuran font di Pengaturan, aplikasi TextView juga berubah
Phan Van Linh

bagaimana ini menjawab pertanyaan?
Siddarth G

48

Gunakan dimensionjenis sumber daya seperti Anda menggunakan stringsumber daya ( DOCS ).

Di dimens.xmlfile Anda , deklarasikan variabel dimensi Anda:

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

Kemudian Anda dapat menggunakan nilai-nilai ini seperti ini:

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

Anda dapat mendeklarasikan dimens.xmlfile yang berbeda untuk berbagai jenis layar. Melakukan hal ini akan menjamin tampilan aplikasi yang Anda inginkan pada perangkat yang berbeda.

Ketika Anda tidak menentukan android:textSizesistem menggunakan nilai default.


1
Masalahnya bukan layar. Ini adalah ukuran font asli yang dipilih dalam pengaturan tampilan android yang mengarah ke masalah yang disebutkan
Himanshu Virmani

24

Juga perhatikan bahwa jika textSize diatur dalam kode, panggilan textView.setTextSize(X)menafsirkan angka (X) sebagai SP. Gunakan setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)untuk mengatur nilai dalam dp .


13

Ini bukan hal yang baik untuk menentukan DIP atau SP lagi dengan kode ketika sudah didefinisikan dalam file dimen.xml.

Saya pikir pilihan terbaik adalah menggunakan PX saat menggunakan nilai dimen.xml:

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

Dengan cara ini, Anda dapat beralih dari DP ke SP jika diperlukan dalam file dimen.xml tanpa harus mengubah kode apa pun.


6

cara sederhana untuk mencegah seluruh aplikasi tidak terpengaruh oleh ukuran font sistem adalah memperbarui Konfigurasi menggunakan aktivitas dasar.

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

ini bisa membantu. tambahkan kode di Aplikasi kustom Anda atau 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;
}

namun, Resource # updateConfiguration dideplicasikan di API level 25, yang artinya akan tidak didukung suatu hari di masa mendatang.


1

Anda dapat menggunakan kode ini:

android:textSize="32dp"

itu memecahkan masalah Anda tetapi Anda harus tahu bahwa Anda harus menghormati keputusan pengguna. dengan ini, mengubah ukuran teks dari pengaturan perangkat tidak akan mengubah nilai ini. jadi itu sebabnya Anda harus menggunakan sp bukan dp . Jadi saran saya adalah meninjau aplikasi Anda dengan ukuran font sistem yang berbeda (kecil, normal, besar, ...)



1

ubah DP ke sp itu adalah praktik yang baik untuk android android: textSize = "18sp"


0

Jika unit yang digunakan adalah SP, bukan DP, dan Anda ingin mengganti penskalaan font sistem, yang Anda lakukan hanyalah mengganti satu metode dalam aktivitas - lihat posting ini .

resource.updateConfiguration sudah usang dan buggy (di Oreo saya punya masalah dengan teks yang diformat).


0

Timpa getResources()dalam Aktivitas.

Atur ukuran TextView dalam sp seperti biasanya android:textSize="32sp"

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

0

di android 8 solusi ini berfungsi untuk saya

tambahkan kode ini dalam aktivitas dasar

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.