TextView.setTextSize가 비정상적으로 작동 함-다른 화면에 대해 동적으로 textview의 텍스트 크기를 설정하는 방법


119

호출 TextView.setTextSize()이 비정상적으로 작동합니다. 호출 직후에 우리가 이전에 설정 한 것보다 훨씬 더 높은 값을 반환하는 setTextSize경우 getTextSize.

우리가하는 일은 다음과 같습니다.

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

전에 본 사람이 있습니까?


2
두 개의 다른 개체에서 텍스트 크기를 얻고 설정하고 있습니까?
Cheryl Simon

답변:


359

여기서 차이점은 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

방금 발견했고 여기에 게시하려고했습니다. 감사합니다!
singhspk

1
나는 실제로 TypedValue (단수)로해야한다고 생각합니다. 가져 오기는 android.util.TypedValue입니다.
Hein du Plessis 2011 년

5
또한이 작업은 API 레벨 7에서만 시작되었습니다. 말도 안되는 API의 또 다른 "함정"입니다.
mxcl

3
인수 순서를 조심하는 것이 중요합니다. 실수로 setTextSize (size, TypedValue.COMPLEX_UNIT_SP)가 실수로 추측 한 순서 였기 때문입니다!
Mark

1
흥미롭게도 Galaxy Nexus의 ICS에서 setTextSize (14, TypedValue.COMPLEX_UNIT_SP)를 사용하면 효과가 없었지만 (기본 크기 사용) Jelly Bean으로 업그레이드했을 때 텍스트가 표시되지 않았습니다 (예 : 0 크기). 제 실수를 깨달았을 때 젤리 빈 버그를보고하려고 했어요!
Mark

20

이 문제는 getTextSize()메서드가 화면 밀도에 따라 픽셀 단위로 크기를 반환 하기 때문에 발생했습니다 ! 실제 TextSize를 얻으려면 다음을 사용하십시오.

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

나는 그것을 해결하기를 바랍니다 :)


2
나는 함께 표시 메트릭을 사용하여 내 문제를 해결했다 setTextSize(int unit, float size).
에드워드 치앙에게

8

설정 변경 글꼴 크기, 뭔가 표시 오류가 발생하면 다음과 같이 할 수 있습니다.

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);

3
누가 textSize를 설정 DIP합니까?
IgorGanapolsky

4

getTextSize ()로 프로그래밍 문제를 설정하려고 할 때 sp / dp / dip 대신 px로 값을 반환하고 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));

3

오랜만에 치고 마침내 이렇게 해결

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

res / values ​​/ dimensions.xml과 같은 차원 폴더를 만듭니다.

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

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

 </resources>

2

간단히 말해서 텍스트 크기를 축소하려면

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

getTextSize ()는 UNIT_PX를 반환하므로 UNIT_PX를 사용해야합니다.


1

Kotlin 솔루션

리소스를 사용하여 설정하려면 다음을 사용하십시오.

textView.setTextSize(COMPLEX_UNIT_PX, textView.resources.getDimension(R.dimen.my_text_size))

리소스 값으로 동일한 작업을 수행하려면이 확장 속성을 추가하여 텍스트 크기를 훨씬 더 쉽게 설정합니다.

textView.textSizeRes = R.dimen.my_text_size

var TextView.textSizeRes
    get() = textSize.toInt()
    set(@DimenRes textSizeRes) {
        setTextSize(COMPLEX_UNIT_PX, resources.getDimension(textSizeRes))
    }

0

이 답변에 약간의 추가 맛을 추가하면 약간의 혼란이 발생했습니다. 이 테스트를 프로젝트에있는 모든 테스트 에 드롭 할 수 있어야 합니다 @RunWith(AndroidJUnit4.class)(dimens.xml에도 dimens를 추가해야 함).

참고 :이 모든 테스트는 통과합니다.

@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로 이미 레이블이 지정된 치수를 전달하면 글꼴 크기 조정이 두 번 수신 됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.