TextView.setTextSize ведет себя ненормально - Как динамически установить размер текста для textview для разных экранов - PullRequest
111 голосов
/ 10 сентября 2010

Звонок TextView.setTextSize() работает ненормально.Сразу после вызова setTextSize, если мы получим getTextSize, он возвращает намного более высокое значение, чем то, что мы установили ранее.

Вот что мы делаем:

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

Кто-нибудь видел это раньше?

Ответы [ 7 ]

344 голосов
/ 10 сентября 2010

Разница здесь в том, что в методе 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
16 голосов
/ 29 декабря 2012

эта проблема произошла, потому что метод getTextSize() возвращает размер в пикселях, зависит от плотности экрана!чтобы получить Actual TextSize используйте это:

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

я надеюсь, что это решит это :)

7 голосов
/ 03 февраля 2015

если настройка изменяет размер шрифта , что-то вызывает ошибку отображения , вы можете сделать как:

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
4 голосов
/ 15 мая 2015

Когда мы пытаемся программно установить setText () с getTextSize (), возвращает значение в px вместо sp / dp / dip, и мы знаем, что 1sp / dp = 1.5px (размер экрана = 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));
2 голосов
/ 07 июня 2016

Короче говоря, если вы хотите уменьшить ваш текстовый размер

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

Поскольку getTextSize () возвращает UNIT_PX, то мы должны использовать UNIT_PX

0 голосов
/ 15 мая 2019

После долгого времени ударил это и наконец решил, как это

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

создайте папку измерений следующим образом: res / values ​​/ sizes.xml

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

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

 </resources>
0 голосов
/ 27 марта 2017

Добавление некоторого дополнительного аромата к этому ответу, а также немного путаницы.Вы должны быть в состоянии включить этот тест в любой @RunWith(AndroidJUnit4.class) тест, который вы имеете в своем проекте (вам также необходимо добавить размеры к вашему измерениям. 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) применяет масштабирование шрифта , поэтому, если вы передадите измерение, уже помеченноекак SP вместо DP, он получит масштабирование шрифта дважды .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...