기본 설정에서 글꼴 크기를 변경하면 Android 애플리케이션에서 TextView의 글꼴 크기가 변경됩니다.


171

응용 프로그램에서 자체 텍스트 크기를 지정하고 싶지만이 작업을 수행하는 데 문제가 있습니다.

장치 설정에서 글꼴 크기를 변경하면 응용 프로그램의 글꼴 크기 TextView도 변경됩니다.


2
장치 기본 글꼴의 글꼴 크기를 변경하면 응용 프로그램 글꼴 크기에도 영향을주는 것이 기본 동작입니다.
Shreyash Mahajan

당신은 여기에서 답을 찾을 수 있습니다 stackoverflow.com/questions/16706076/...
Bhavesh Jethani 보낸 사람에게

텍스트 크기에 sp를 사용하되… 사용자의 글꼴 크기 기본 설정에 따라 크기가 조정됩니다. 다른 모든 것에는 dp를 사용하십시오.
라이브 사랑

답변:


231

실제로 설정 글꼴 크기는의 크기에만 영향을줍니다 sp. 정의 - 모든 그래서 당신은 할 필요가 textSize있는 dp대신에 sp, 다음 설정 앱에서 텍스트 크기를 변경하지 않습니다.

여기에 문서에 대한 링크는 다음과 같습니다 치수

그러나 예상되는 동작은 모든 앱의 글꼴이 사용자의 기본 설정을 존중한다는 것입니다. 사용자가 글꼴 크기를 조정하고 싶은 이유는 여러 가지가 있으며 그 중 일부는 시각 장애가있는 의료 사용자 일 수도 있습니다. 텍스트 dp대신에 사용하면 sp일부 앱 사용자를 기꺼이 차별 할 수 있습니다.

즉 :

android:textSize="32dp"

12
오래 전부터 언제 사용해야하는지 sp, 언제 사용해야하는지에 대한 규칙이 있는지 알고 싶었습니다 dp. 여기에 정말 좋은 답변이 있습니다 : stackoverflow.com/questions/11638691/…
Sam Sam

129

가장 쉬운 방법은 다음과 같은 것을 사용하는 것입니다.

android:textSize="32sp"

textSize속성 에 대한 자세한 내용을 보려면 Android 개발자 설명서를 확인하십시오 .


1
이것이 실제로 'dp'대신 'sp'를 사용하여 TS에 문제가있는 이유입니다.
Boy

8
나는 여전히 100 개의 공감대가있는 이유를 모른다. 응용 프로그램에서 설정된 텍스트 크기에 sp를 사용하면 그런 다음 Setting에서 글꼴 크기를 변경하면 응용 프로그램의 TextView도 변경됩니다.
Phan Van Linh

이 질문에 어떻게 대답합니까?
Siddarth G

48

dimension리소스를 사용하는 것처럼 리소스 유형을 사용하십시오 string( DOCS ).

당신의에서 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
문제는 화면이 아닙니다. 이 문제에 대한 리드가 언급 한 안드로이드 디스플레이 설정에서 선택한 기본 글꼴 크기입니다
Himanshu Virmani을

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

전체 앱이 시스템 글꼴 크기에 영향을받지 않도록하는 간단한 방법은 기본 활동을 사용하여 구성을 업데이트하는 것입니다.

//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

kotlin을 위해, 그것은 나를 위해 작동

priceTextView.textSize = 12f

1

DP를 sp로 변경하면 android android : textSize = "18sp"에 적합합니다.


0

사용 된 단위가 DP가 아닌 SP이고 시스템 글꼴 크기 조정을 재정의하려는 경우 작업에서 한 가지 방법 만 재정의 하면됩니다 (이 게시물 참조) .

resources.updateConfiguration 은 더 이상 사용되지 않으며 버그가 있습니다 (Oreo에서는 형식이 지정된 텍스트에 문제가 있음).


0

우세하다 getResources()활동 .

평소와 같이 sp에서 TextView의 크기를 설정하십시오. android:textSize="32sp"

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

0

안드로이드 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.