web-dev-qa-db-ja.com

ネイティブ設定からフォントサイズを変更すると、AndroidアプリケーションのTextViewのフォントサイズが変わる

自分のアプリケーションで自分のテキストサイズを指定したいのですが、これを行うのに問題があります。

デバイス設定でフォントサイズを変更すると、アプリケーションTextViewのフォントサイズも変わります。

148
VicJordan

実際、Settingsのフォントサイズはspのサイズにのみ影響します。 textSizeではなくdpspを定義してください。そうすれば、設定によってアプリのテキストサイズが変わることはありません。

これはドキュメンテーションへのリンクです: 寸法

ただし、期待される動作は、すべてのアプリのフォントがユーザーの設定を尊重することです。ユーザーがフォントサイズを調整したいと思う理由はたくさんあり、そのうちのいくつかは医学的な視覚障害のあるユーザーでさえあるかもしれません。テキストにdpの代わりにspを使用すると、アプリの一部のユーザーに対して不本意に差別される可能性があります。

すなわち:

Android:textSize="32dp"
200
sandrstar

最も簡単な方法は、次のようなものを使用することです。

Android:textSize="32sp"

textSizeプロパティについてもっと知りたい場合は、 Android開発者向けドキュメント をチェックしてください。

127
Evan Long

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を指定しないと、システムはデフォルト値を使用します。

45
ashakirov

TextSizeがコードで設定されている場合は、textView.setTextSize(X)を呼び出すと数値(X)がSPとして解釈されます。 setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)を使用して dp に値を設定します。

23
Arpit

Dimen.xmlファイルですでに定義されている場合は、コードでDIPまたはSPを再度指定する必要はありません。

Dimen.xmlの値を使用するときは、PXを使用するのが最善の選択肢だと思います。

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

こうすることで、dimen.xmlファイルで必要に応じてコードを変更せずにDPからSPに切り替えることができます。

12
mba

アプリケーション全体がシステムフォントサイズの影響を受けないようにする簡単な方法は、基本アクティビティを使用して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());
}
4
Usama Saeed US

これは助けになるかもしれません。カスタムアプリケーションまたは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で重複しているため、将来サポートされなくなる予定です。

1
Arno_J

textSize SPs の代わりに DPs でフォントサイズを使用すると、これを解決できます。

1
bpr10

あなたはXMLでTextViewタグを書く必要があります:

Android:textSize="32dp"
1
neha

ActivityでgetResources()をオーバーライドします。

Android:textSize="32sp"のように通常通りTextViewのサイズをspに設定します。

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

使用している単位がDPではなくSPで、システムフォントの拡大縮小をオーバーライドしたい場合は、アクティビティ内の1つのメソッドをオーバーライドするだけです - この記事を参照

resources.updateConfiguration は非推奨でバグがあります(Oreoではフォーマットされたテキストに問題がありました)。

0
Maxim Saplin

このコードを使うことができます:

Android:textSize="32dp"

それはあなたの問題を解決しますが、あなたはあなたがユーザーの決定を尊重するべきであることを知っていなければなりません。これにより、デバイス設定からテキストサイズを変更してもこの値は変更されません。そのため、 dp の代わりに sp を使用する必要があります。だから私の提案は、異なるシステムフォントサイズ(小、中、大、...)であなたのアプリを見直すことです。

0
Hossein Karami