Chcę określić własny rozmiar tekstu w mojej aplikacji, ale mam z tym problem.
Kiedy zmieniam rozmiar czcionki w ustawieniach urządzenia, TextView
zmienia się również rozmiar czcionki mojej aplikacji .
Chcę określić własny rozmiar tekstu w mojej aplikacji, ale mam z tym problem.
Kiedy zmieniam rozmiar czcionki w ustawieniach urządzenia, TextView
zmienia się również rozmiar czcionki mojej aplikacji .
Odpowiedzi:
W rzeczywistości rozmiar czcionki Ustawienia wpływa tylko na rozmiary w sp
. Więc wszystko co musisz zrobić - określić textSize
w dp
zamiast 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 dp
zamiast sp
tekstu może prowadzić do niezamierzonego dyskryminowania niektórych użytkowników aplikacji.
to znaczy:
android:textSize="32dp"
sp
i kiedy powinienem używać dp
. Tutaj dostałem naprawdę dobrą odpowiedź: stackoverflow.com/questions/11638691/…
Najłatwiej to zrobić, używając czegoś podobnego do następującego:
android:textSize="32sp"
Jeśli chcesz dowiedzieć się więcej o textSize
usłudze, zajrzyj do dokumentacji dla programistów Androida .
Użyj dimension
typu zasobów, takich jak zasoby, których używasz string
( DOCS ).
W swoim dimens.xml
pliku 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.xml
pliki 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:textSize
system użyje wartości domyślnych.
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.
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());
}
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.
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, ...)
dla kotlina to działa dla mnie
priceTextView.textSize = 12f
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).
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);
}