web-dev-qa-db-ja.com

TextView.setTextSizeの動作が異常です-さまざまな画面でtextviewのテキストサイズを動的に設定する方法

TextView.setTextSize()の呼び出しは異常に動作しています。 setTextSizeを呼び出した直後に、getTextSizeを取得した場合、以前に設定した値よりもはるかに高い値を返します。

これが私たちがやっていることです。

zoomControl.setOnZoomInClickListener(new OnClickListener() {
    public void onClick(View view) {
        float size = mViewShabad.getTextSize() + 1;
        textView.setTextSize(size);
    }
});

誰もこれを見たことがありますか?

112
singhspk

ここでの違いは、setTextSize(int size)メソッドでは、単位タイプがデフォルトで「sp」または「スケーリングされたピクセル」であるということです。この値は、画面密度(ldpi、mdpi、hdpi)ごとに異なるピクセル寸法になります。

一方、getTextSize()は、テキストの実際のピクセル寸法を返します。

setTextSize(int unit, float size)を使用して、ユニットタイプを指定できます。この定数値はTypedValueクラスで見つけることができますが、それらのいくつかは次のとおりです。

TypedValue.COMPLEX_UNIT_PX   //Pixels

TypedValue.COMPLEX_UNIT_SP   //Scaled Pixels

TypedValue.COMPLEX_UNIT_DIP  //Device Independent Pixels
344
kcoppock

この問題は、getTextSize()メソッドが画面密度に依存するピクセル単位のサイズを返すために発生しました。実際のTextSizeを取得するには、これを使用します。

DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);

私はそれがそれを解決することを望みます:)

16
M_AWADI

フォントサイズの変更を設定する場合、何かがエラーを表示する場合、次のようにできます。

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
7

GetTextSize()でsetText()をプログラム的に問題にしようとすると、sp/dp/dipではなくpxで値を返し、1sp/dp = 1.5px(screen size = 240)を知っています。

 titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f)); 

私のために完璧に働いているか、displaymatrix対px:sp/dp比を使用して、その値を1.5fに置き換えることができます

means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));
4
ranjan

要するに、テキストサイズを縮小したい場合

float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);

GetTextSize()はUNIT_PXを返すため、UNIT_PXを使用する必要があります

2
Frank Nguyen

長い間これを打って、最終的にこのように解決しました

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
          getResources().getDimension(R.dimen.textsize));

このres/values/dimensions.xmlのようなdimenフォルダーを作成します

<?xml version="1.0" encoding="utf-8"?>
<resources>

 <dimen name="textsize">8sp</dimen>

 </resources>
2
NagarjunaReddy

この答えにフレーバーを追加すると、少し混乱するようになりました。 shouldプロジェクトにある@RunWith(AndroidJUnit4.class)テストにこのテストをドロップできます(dimensをdimens.xmlに追加する必要もあります)。

注:これらのテストはすべて合格

@Test public void testScaledFontSizes() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    final Context context = InstrumentationRegistry.getTargetContext();

    Configuration configuration = context.getResources().getConfiguration();
    configuration.fontScale = 2.0f;
    configuration.densityDpi = 160; // mdpi, 1:1
    context.getResources().updateConfiguration(configuration, null);

    float scaledTextSize = context.getResources().getDimensionPixelSize(R.dimen.sp_15);
    assertEquals(30.0f, scaledTextSize);

    // Create a new TextView with the explicitly set configuration
    TextView textView = new TextView(context);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledTextSize);

    // 30, because font size is scaled
    assertEquals(30.0f, textView.getTextSize());

    // This is what we *don't* want, it's scaled *twice*!
    textView.setTextSize(scaledTextSize);
    assertEquals(60.0f, textView.getTextSize());

    // DP instead of SP tests
    float fifteenDp = context.getResources().getDimensionPixelSize(R.dimen.dp_15);
    assertEquals(15.0f, fifteenDp);

    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fifteenDp);
    // Still 15, because it's DP, not SP
    assertEquals(15.0f, fifteenDp);

    textView.setTextSize(fifteenDp);
    // 30, because setTextSize DOES font scaling
    assertEquals(30.0f, textView.getTextSize());
  }
}

私が見つけた大きなポイントは、TextView.setTextSize(float)フォントのスケーリングを適用するであるため、DPではなくSPと既にラベル付けされたdimen thatを渡すと、フォントのスケーリングtwice

0
Kevin Grant