Rozmiar czcionki TextView w aplikacji na Androida zmienia się po zmianie rozmiaru czcionki z ustawień natywnych

171

Chcę określić własny rozmiar tekstu w mojej aplikacji, ale mam z tym problem.

Kiedy zmieniam rozmiar czcionki w ustawieniach urządzenia, TextViewzmienia się również rozmiar czcionki mojej aplikacji .

Vikasdeep Singh
źródło
2
Domyślnym zachowaniem jest to, że zmiana rozmiaru czcionki natywnej czcionki urządzenia wpływa również na rozmiar czcionki aplikacji.
Shreyash Mahajan
odpowiedź można znaleźć tutaj stackoverflow.com/questions/16706076/…
Bhavesh Jethani
Użyj sp dla rozmiaru tekstu… ponieważ jest on skalowany przez preferencje użytkownika dotyczące rozmiaru czcionki. Użyj dp do wszystkiego innego.
miłość na żywo

Odpowiedzi:

231

W rzeczywistości rozmiar czcionki Ustawienia wpływa tylko na rozmiary w sp. Więc wszystko co musisz zrobić - określić textSizew dpzamiast sp, następnie ustawienia nie zmieni rozmiar tekstu w aplikacji.

Oto link do dokumentacji: Wymiary

Należy jednak pamiętać, że oczekiwanym zachowaniem jest to, że czcionki we wszystkich aplikacjach są zgodne z preferencjami użytkownika. Istnieje wiele powodów, dla których użytkownik może chcieć dostosować rozmiary czcionek, a niektórzy z nich mogą być nawet osobami z upośledzeniem wzroku. Używanie dpzamiast sptekstu może prowadzić do niezamierzonego dyskryminowania niektórych użytkowników aplikacji.

to znaczy:

android:textSize="32dp"
sandrstar
źródło
12
Dawno temu chciałem wiedzieć, czy istnieją jakieś zasady określające, kiedy powinienem spi kiedy powinienem używać dp. Tutaj dostałem naprawdę dobrą odpowiedź: stackoverflow.com/questions/11638691/…
Sam,
129

Najłatwiej to zrobić, używając czegoś podobnego do następującego:

android:textSize="32sp"

Jeśli chcesz dowiedzieć się więcej o textSizeusłudze, zajrzyj do dokumentacji dla programistów Androida .

Evan Long
źródło
1
właśnie dlatego TS ma problem, używając „sp” zamiast „dp”
Boy
8
Nadal nie wiem, dlaczego jest 100 głosów za. bo jeśli używamy sp do ustawiania textize w aplikacji. Następnie zmieniamy rozmiar czcionki w ustawieniach, zmienia się również TextView w aplikacji
Phan Van Linh
jak to odpowiada na pytanie?
Siddarth G
48

Użyj dimensiontypu zasobów, takich jak zasoby, których używasz string( DOCS ).

W swoim dimens.xmlpliku zadeklaruj zmienne wymiarów:

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

Następnie możesz użyć tych wartości w następujący sposób:

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

Możesz zadeklarować różne dimens.xmlpliki dla różnych typów ekranów. Dzięki temu uzyskasz pożądany wygląd swojej aplikacji na różnych urządzeniach.

Jeśli nie określisz, android:textSizesystem użyje wartości domyślnych.

Ashakirov
źródło
1
problem nie dotyczy ekranów. Jest to natywny rozmiar czcionki wybrany w ustawieniach wyświetlania Androida, który prowadzi do wspomnianego problemu
Himanshu Virmani
24

Należy również pamiętać, że jeśli parametr textSize jest ustawiony w kodzie, wywołanie textView.setTextSize(X)interpretuje liczbę (X) jako SP. Służy setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)do ustawiania wartości w dp .

Arpit
źródło
13

Nie jest dobrym rozwiązaniem ponowne określanie DIP lub SP za pomocą kodu, jeśli zostało już zdefiniowane w pliku dimen.xml.

Myślę, że najlepszą opcją jest użycie PX przy użyciu wartości dimen.xml:

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

W ten sposób możesz w razie potrzeby przełączyć się z DP na SP w pliku dimen.xml bez konieczności zmiany kodu.

mba
źródło
6

Prostym sposobem uniknięcia wpływu rozmiaru czcionki systemowej na całą aplikację jest updateConfiguration przy użyciu podstawowego działania.

//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
źródło
1

to może pomóc. Dodaj kod w swojej niestandardowej aplikacji lub 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;
}

Jednak zasób # updateConfiguration jest uszczuplony na poziomie API 25, co oznacza, że ​​pewnego dnia w przyszłości nie będzie obsługiwany.

Arno_J
źródło
1

Możesz użyć tego kodu:

android:textSize="32dp"

rozwiązuje twój problem, ale musisz wiedzieć, że powinieneś szanować decyzje użytkowników. w związku z tym zmiana rozmiaru tekstu w ustawieniach urządzenia nie zmieni tej wartości. dlatego musisz użyć sp zamiast dp . Sugeruję więc, aby przejrzeć aplikację z różnymi rozmiarami czcionek systemowych (mały, normalny, duży, ...)

Hossein Karami
źródło
1

dla kotlina to działa dla mnie

priceTextView.textSize = 12f
Shihab Uddin
źródło
1

zmień DP na sp to dobra praktyka dla Androida android: textSize = "18sp"

sanjay
źródło
0

Jeśli używane jednostki to SP, a nie DP, i chcesz nadpisać systemowe skalowanie czcionek, wszystko, co robisz, to zastąpienie jednej metody w działaniu - zobacz ten post .

resources.updateConfiguration jest przestarzała i zawiera błędy (na Oreo miałem problemy ze sformatowanym tekstem).

Maxim Saplin
źródło
0

Zastąp getResources()w aktywności.

Ustaw rozmiar TextView w sp, jak zwykle, jak android:textSize="32sp"

override fun getResources(): Resources {
    return super.getResources().apply {
        configuration.fontScale = 1F
        updateConfiguration(configuration, displayMetrics)
    }
}
sójka
źródło
0

w Androidzie 8 to rozwiązanie działa dla mnie

dodaj ten kod w podstawowym działaniu

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

źródło https://stackoverflow.com/a/57225687/7985871

emad pirayesh
źródło