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.

Vikasdeep Singh
sumber
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"
sandrstar
sumber
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 .

Evan Long
sumber
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.

ashakirov
sumber
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 .

Arpit
sumber
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.

mba
sumber
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());
}
Usama Saeed US
sumber
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.

Arno_J
sumber
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, ...)

Hossein Karami
sumber
1

untuk kotlin, itu bekerja untukku

priceTextView.textSize = 12f
Shihab Uddin
sumber
1

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

sanjay
sumber
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).

Maxim Saplin
sumber
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)
    }
}
jay
sumber
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

emad pirayesh
sumber