自分のアプリケーションで自分のテキストサイズを指定したいのですが、これを行うのに問題があります。
デバイス設定でフォントサイズを変更すると、アプリケーションTextView
のフォントサイズも変わります。
実際、Settingsのフォントサイズはsp
のサイズにのみ影響します。 textSize
ではなくdp
でsp
を定義してください。そうすれば、設定によってアプリのテキストサイズが変わることはありません。
これはドキュメンテーションへのリンクです: 寸法
ただし、期待される動作は、すべてのアプリのフォントがユーザーの設定を尊重することです。ユーザーがフォントサイズを調整したいと思う理由はたくさんあり、そのうちのいくつかは医学的な視覚障害のあるユーザーでさえあるかもしれません。テキストにdp
の代わりにsp
を使用すると、アプリの一部のユーザーに対して不本意に差別される可能性があります。
すなわち:
Android:textSize="32dp"
最も簡単な方法は、次のようなものを使用することです。
Android:textSize="32sp"
textSize
プロパティについてもっと知りたい場合は、 Android開発者向けドキュメント をチェックしてください。
dimension
タイプのリソース( _ docs _ )を使用するのと同じように、string
タイプのリソースを使用します。
dimens.xml
ファイルで、次元変数を宣言します。
<?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>
それからあなたはこのようにこれらの値を使うことができます:
<TextView
Android:layout_height="@dimen/textview_height"
Android:layout_width="@dimen/textview_width"
Android:textSize="@dimen/font_size"/>
さまざまな種類の画面に対して、さまざまなdimens.xml
ファイルを宣言できます。これを実行すると、さまざまなデバイスでアプリの外観が適切に保証されます。
Android:textSize
を指定しないと、システムはデフォルト値を使用します。
TextSizeがコードで設定されている場合は、textView.setTextSize(X)
を呼び出すと数値(X)がSPとして解釈されます。 setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)
を使用して dp に値を設定します。
Dimen.xmlファイルですでに定義されている場合は、コードでDIPまたはSPを再度指定する必要はありません。
Dimen.xmlの値を使用するときは、PXを使用するのが最善の選択肢だと思います。
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
こうすることで、dimen.xmlファイルで必要に応じてコードを変更せずにDPからSPに切り替えることができます。
アプリケーション全体がシステムフォントサイズの影響を受けないようにする簡単な方法は、基本アクティビティを使用してupdateConfigurationを更新することです。
//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());
}
これは助けになるかもしれません。カスタムアプリケーションまたは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;
}
ただし、Resource#updateConfigurationはAPIレベル25で重複しているため、将来サポートされなくなる予定です。
textSize
で SPs の代わりに DPs でフォントサイズを使用すると、これを解決できます。
あなたはXMLでTextViewタグを書く必要があります:
Android:textSize="32dp"
ActivityでgetResources()
をオーバーライドします。
Android:textSize="32sp"
のように通常通りTextViewのサイズをspに設定します。
override fun getResources(): Resources {
return super.getResources().apply {
configuration.fontScale = 1F
updateConfiguration(configuration, displayMetrics)
}
}
使用している単位がDPではなくSPで、システムフォントの拡大縮小をオーバーライドしたい場合は、アクティビティ内の1つのメソッドをオーバーライドするだけです - この記事を参照 。
resources.updateConfiguration は非推奨でバグがあります(Oreoではフォーマットされたテキストに問題がありました)。
このコードを使うことができます:
Android:textSize="32dp"
それはあなたの問題を解決しますが、あなたはあなたがユーザーの決定を尊重するべきであることを知っていなければなりません。これにより、デバイス設定からテキストサイズを変更してもこの値は変更されません。そのため、 dp の代わりに sp を使用する必要があります。だから私の提案は、異なるシステムフォントサイズ(小、中、大、...)であなたのアプリを見直すことです。