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


171

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

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


2
デバイスのネイティブフォントのフォントサイズを変更すると、アプリケーションのフォントサイズにも影響するのがデフォルトの動作です。
Shreyash Mahajan

あなたはここから答えを見つけることができますstackoverflow.com/questions/16706076/...
Bhavesh Jethani

テキストサイズにはspを使用します。これは、ユーザーのフォントサイズ設定によってスケーリングされるためです。それ以外の場合はdpを使用してください。
live-love

回答:


230

実際、設定のフォントサイズはのサイズにのみ影響しspます。定義-すべてのようにあなたは何をする必要があるtextSizedpするのではなくsp、その後の設定はアプリ内のテキストのサイズを変更しません。

ここではドキュメントへのリンクです:外形寸法

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

つまり:

android:textSize="32dp"

12
ずっと前にsp、いつ使うべきか、いつ使うべきかというルールがあるかどうか知りたかったdp。私はここで本当に良い反応を得た:stackoverflow.com/questions/11638691/...
サム・

129

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

android:textSize="32sp"

textSizeプロパティについて詳しく知りたい場合は、Androidデベロッパードキュメントをご覧ください。


1
これが実際にTSに問題がある理由です。「dp」の代わりに「sp」を使用します
Boy

8
100の賛成票がある理由はまだわかりません。アプリケーションでset textsizeにspを使用すると、次に、設定でフォントサイズを変更し、アプリケーションのTextViewも変更します
ファンファンリン

これはどのように質問に答えますか?
Siddarth G

48

リソース(DOCSdimensionを使用するのと同じように、リソースのタイプを使用します。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、システムはデフォルト値を使用します。


1
問題は画面ではありません。前述の問題につながるのは、Androidディスプレイ設定で選択されたネイティブフォントサイズです
Himanshu Virmani 2013年

24

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


13

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

dimen.xml値を使用する場合は、PXを使用するのが最良のオプションだと思います。

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

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


6

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

1

これは役立つかもしれません。カスタムアプリケーションまたは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

次のコードを使用できます。

android:textSize="32dp"

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



1

DPをspに変更します。これは、androidの良い例です。android:textSize = "18sp"


0

使用されている単位がDPではなくSPであり、システムフォントスケーリングをオーバーライドする場合は、アクティビティで1つのメソッドをオーバーライドするだけです。この投稿を参照してください

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


0

getResources()アクティビティで上書き。

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

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

0

Android 8では、この解決策は私にとってうまくいきます

このコードを基本アクティビティに追加します

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

ソース https://stackoverflow.com/a/57225687/7985871

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.