다른 언어 및 문화 지원

앱에는 특정 문화에만 존재할 가능성이 있는 리소스가 포함됩니다. 예를 들어 앱에는 현재의 언어로 번역되는 특정 문화의 문자열이 포함될 수 있습니다. 앱에서 다른 리소스와 특정 문화의 콘텐츠를 분리해두는 것이 좋습니다. Android는 시스템 언어 설정에 따라 각 언어 및 특정 문화의 리소스를 분석합니다. Android 프로젝트의 리소스 디렉토리를 사용하여 여러 가지 언어에 지원을 제공할 수 있습니다.

앱을 사용하는 사용자의 문화에 맞춘 리소스를 지정할 수 있습니다. 사용자의 언어와 문화에 적절한 리소스 유형을 제공할 수 있습니다. 예를 들어 다음 스크린샷은 기기의 기본(en_US) 언어와 스페인어(es_ES)로 문자열과 드로어블 리소스를 표시하는 앱을 보여줍니다.

이 앱은 현재 언어에 따라 다양한 텍스트와 아이콘을 표시합니다.

그림 1. 현재 언어에 따라 여러 가지 리소스를 사용하는 앱

Android SDK Tools를 사용해 프로젝트를 생성한 경우(Android 프로젝트 생성 참조), 이 도구가 프로젝트 최상위에 res/ 디렉토리를 생성합니다. 이 res/ 디렉토리 안에는 다양한 리소스 유형에 대한 하위 디렉토리가 있습니다. 문자열 값이 포함된 res/values/strings.xml과 같은 몇몇 기본 파일도 있습니다.

여러 언어를 지원하는 것은 언어별 리소스를 사용하는 데 그치지 않습니다. 어떤 사용자는 오른쪽에서 왼쪽(RTL)으로 보는 스크립트를 사용하는 언어(예: 아랍어, 히브리어)를 UI 언어로 선택합니다. 어떤 사용자는 LTR 스크립트를 사용하는 언어(예: 영어)를 UI 언어로 설정하였으나 RTL 스크립트를 사용하는 언어로 콘텐츠를 보거나 생성합니다. 이 두 가지 유형의 사용자를 지원하기 위해서는 앱이 다음과 같은 작업을 수행해야 합니다.

  • RTL 언어에 RTL UI 레이아웃을 사용합니다.
  • 서식이 정해진 메시지에 표시된 텍스트 데이터의 방향을 감지하고 선언합니다. 일반적으로 텍스트 데이터 방향을 알아내는 메서드를 호출하면 됩니다.

언어 디렉토리와 리소스 파일 생성

더 많은 언어에 대한 지원을 추가하려면 res/ 안에 추가 디렉토리를 생성합니다. 각 디렉토리의 이름은 다음 형식을 준수해야 합니다.

<resource type>-b+<language code>[+<country code>]

예를 들어 values-b+es/에는 언어 코드 es가 포함된 언어에 대한 문자열 리소스가 포함됩니다. 마찬가지로 mipmap-b+es+ES/에는 언어 코드 es와 국가 코드 ES가 포함된 언어에 대한 아이콘이 포함됩니다. Android는 런타임에 기기의 언어 설정에 따라 적합한 리소스를 로드합니다. 자세한 내용은 대체 리소스 제공을 참조하세요.

지원할 언어를 결정했으면 리소스 하위 디렉토리와 파일을 생성합니다. 예:

MyProject/
    res/
       values/
           strings.xml
       values-b+es/
           strings.xml
       mipmap/
           country_flag.png
       mipmap-b+es+ES/
           country_flag.png

다음은 다양한 언어의 다양한 리소스 파일에 대한 몇 가지 예입니다.

영어 문자열(기본 언어), /values/strings.xml:

<resources>
    <string name="hello_world">Hello World!</string>
</resources>

스페인어 문자열(es 언어), /values-es/strings.xml:

<resources>
    <string name="hello_world">¡Hola Mundo!</string>
</resources>

미국 국기 아이콘(기본 언어), /mipmap/country_flag.png:

미국 국기 아이콘

그림 2. 기본(en_US) 언어에 사용된 아이콘

스페인 국기 아이콘(es_ES 언어), /mipmap-b+es+ES/country_flag.png:

스페인 국기 아이콘

그림 3. es_ES 언어에 사용된 아이콘

참고: 예를 들어, 비트맵 드로어블의 현지화 버전을 제공하려는 경우에는 모든 리소스 유형에 언어 한정자(또는 구성 한정자)를 사용할 수 있습니다. 자세한 내용은 현지화를 참조하세요.

앱에서의 리소스 사용

각 리소스의 name 속성을 사용하여 소스 코드와 다른 XML 파일에서 리소스를 참조할 수 있습니다.

소스 코드에서 구문 R.<resource type>.<resource name>을 사용하여 리소스를 참조할 수 있습니다. 이러한 식으로 리소스를 수락하는 다양한 메서드가 있습니다.

예:

Kotlin

// Get a string resource from your app's Resources
val hello = resources.getString(R.string.hello_world)

// Or supply a string resource to a method that requires a string
TextView(this).apply {
    setText(R.string.hello_world)
}

Java

// Get a string resource from your app's Resources
String hello = getResources().getString(R.string.hello_world);

// Or supply a string resource to a method that requires a string
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

다른 XML 파일에서 XML 속성이 호환되는 값을 수락할 때마다 구문 @<resource type>/<resource name>을 사용하여 리소스를 참조할 수 있습니다.

예:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/country_flag" />

메시지 텍스트 서식 지정

앱에서 가장 많이 하는 작업 중 하나는 텍스트 서식을 지정하는 것입니다. 현지화된 메시지는 텍스트와 숫자 데이터를 적절한 위치에 넣는 것으로 서식이 지정됩니다. 안타깝게도 RTL UI 또는 RTL 데이터를 처리할 때 단순한 서식 지정만으로는 잘못되거나 읽을 수 없는 텍스트 출력이 표시됩니다.

아랍어, 히브리어, 페르시아어, 우르두어와 같은 언어는 전체적으로 RTL 방향으로 적습니다. 그러나 숫자, 임베디드 LTR 텍스트와 같은 일부 요소는 나머지는 RTL 텍스트인 가운데 유일하게 LTR 방향으로 작성됩니다. 영어를 포함해 LTR 스크립트를 사용하는 언어도 양방향입니다. RTL 방향으로 표시해야 하는 임베디드 RTL 스크립트를 포함할 수 있기 때문입니다.

대부분의 경우, 앱 자체에서 이런 반대 방향의 임베디드 텍스트 인스턴스가 생성됩니다. 앱은 임의의 언어(및 임의의 텍스트 방향)로 된 텍스트 데이터를 현지화된 메시지에 넣습니다. 이렇게 텍스트 방향이 섞였을 때 반대 방향 텍스트가 시작되고 끝나는 지점이 명확히 표시되지 않는 경우가 많습니다. 이런 앱 생성 텍스트의 특징이 대부분의 문제를 일으킵니다.

일반적으로 시스템의 기본적인 양방향 텍스트 처리 방식은 예상에 따라 텍스트를 렌더링하는 것이지만 앱이 텍스트를 현지화된 메시지에 넣었을 때 텍스트가 제대로 렌더링되지 않을 수 있습니다. 다음의 상황은 텍스트가 올바르게 나타나지 않을 가능성이 큰 사례의 예시를 보여줍니다.

  • 메시지 도입부에 삽입:

    PERSON_NAME이 전화를 걸고 있습니다

  • 주소나 전화번호와 같은 숫자로 시작:

    987 654-3210

  • 전화번호 등에서와 같이 구두점으로 시작:

    +19876543210

  • 구두점으로 종료:

    정말이세요?

  • 이미 양방향 텍스트가 포함:

    בננה라는 단어는 히브리어로 바나나라는 뜻입니다.

예시

예를 들어 앱이 런타임에서 %s 자리에 주소를 넣어서 "%s가 맞습니까?"라는 메시지를 표시해야 하는 경우가 있다고 가정해보세요. 앱이 여러 가지 UI 언어를 지원하기 때문에 메시지는 언어별 리소스에서 생성되고 RTL 언어를 사용 중일 때 RTL 방향을 사용합니다. 히브리어 UI의 경우에는 다음과 같이 표시되어야 합니다.

האם התכוונת ל %s?

그러나 그 언어로 된 텍스트가 포함되지 않은 데이터베이스에서 추천 단어를 가져올 수 있습니다. 예를 들어 변수 자리에 들어갈 주소가 캘리포니아에 있는 지역일 경우 영어 텍스트를 사용하는 데이터베이스로 표시됩니다. 텍스트 방향에 대한 아무런 힌트 없이 "15 Bay Street, Laurel, CA"라는 주소를 RTL 메시지에 넣으면 예상한 결과가 나오지 않거나 잘못된 결과가 나옵니다.

האם התכוונת ל 15 Bay Street, Laurel, CA?

번지 수가 원래의 형식대로 왼쪽에 표시되지 않고 오른쪽에 표시되어서 이상한 우편번호처럼 보입니다. LTR 텍스트 방향을 사용하는 메시지 안에 RTL 텍스트를 포함해도 같은 문제가 발생할 수 있습니다.

설명과 해결 방법

앞의 예시에서 본 문제는 텍스트 포매터에서 "15"가 주소에 포함된다는 것을 지정하지 않았고 시스템에서 "15"가 앞에 오는 RTL 텍스트의 일부인지 그 뒤에 오는 LTR 텍스트의 일부인지 알아내지 못했기 때문에 발생합니다.

이 문제를 해결하려면 BidiFormatter 클래스에 있는 unicodeWrap() 메서드를 현지화된 메시지에 넣는 모든 텍스트에 사용합니다. unicodeWrap()를 사용해서는 안 되는 경우는 다음과 같은 상황뿐입니다.

  • 텍스트가 기계 판독이 가능한 문자열(예: URI 또는 SQL 쿼리)로 삽입될 경우.
  • 텍스트가 이미 적절히 래핑되었다는 것을 알고 있습니다.

unicodeWrap() 메서드는 문자열의 방향을 감지하고 방향을 선언하는 유니코드 서식 지정 문자로 래핑합니다. "15"가 LTR로 선언된 텍스트 안에 나타나기 때문에 올바른 위치에 표시됩니다.

האם התכוונת ל 15 Bay Street, Laurel, CA?

다음 코드 스니펫은 unicodeWrap()을 사용하는 방법을 보여줍니다.

Kotlin

val mySuggestion = "15 Bay Street, Laurel, CA"
val myBidiFormatter: BidiFormatter = BidiFormatter.getInstance()

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean), myBidiFormatter.unicodeWrap(mySuggestion))

Java

String mySuggestion = "15 Bay Street, Laurel, CA";
BidiFormatter myBidiFormatter = BidiFormatter.getInstance();

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean),
        myBidiFormatter.unicodeWrap(mySuggestion));

참고: 앱이 Android 4.3(API 레벨18) 이상을 대상으로 할 경우 Android Framework에 있는 BidiFormatter 버전을 사용하세요. 그렇지 않을 경우 Support 라이브러리에 있는 BidiFormatter 버전을 사용하세요.

숫자 서식 지정

메서드 호출이 아니라 문자열 서식 지정을 사용하여 숫자를 앱 로직으로 된 문자열로 변환합니다.

Kotlin

var myIntAsString = "$myInt"

Java

String myIntAsString = String.format("%d", myInt);

그러면 언어에 맞는 적절한 숫자로 서식이 지정되며, 다른 자리수 세트를 사용하게 될 수도 있습니다.

String.format()을 사용하여 자체적인 자리수 세트를 사용하는 언어(예: 페르시아어와 대부분 아랍어)로 설정된 기기에 SQL 쿼리를 생성할 경우 쿼리에 대한 매개변수가 숫자가 되면 문제가 발생합니다. 숫자가 그 언어의 자리수로 서식이 지정되기 때문에 SQL에서는 이 자리수가 유효하지 않습니다.

ASCII 형식 숫자를 유지하고 SQL 쿼리의 유효성을 보존하려면 언어를 첫 번째 매개변수로 포함하는 String.format() 오버로드 버전을 사용해야 합니다. 언어 인수는 Locale.US가 되어야 합니다.

레이아웃 미러링 지원

RTL 스크립트를 사용하는 사람들은 RTL 사용자 인터페이스를 선호합니다. 이 인터페이스에는 오른쪽 정렬 메뉴, 오른쪽 정렬 텍스트, 왼쪽을 가리키는 앞쪽 화살표가 포함됩니다.

그림 4는 설정 앱 안의 LTR 버전 화면과 RTL 버전 화면의 차이를 보여줍니다.

알림 영역은 오른쪽 상단 모서리 근처에 오른쪽 정렬되어 있고, 앱 바의 메뉴 버튼은 왼쪽 상단 모서리 근처에 있으며, 화면 주요부의 콘텐츠는 왼쪽 정렬되어 LTR로 표시됩니다. 뒤로 버튼은 왼쪽 아래 모서리에 있으며 왼쪽을 가리킵니다. 알림 영역은 왼쪽 상단 모서리 근처에 왼쪽 정렬되어 있고, 앱 바의 메뉴 버튼은 오른쪽 상단 모서리 근처에 있으며, 화면 주요부의 콘텐츠는 오른쪽 정렬되어 RTL로 표시됩니다. 뒤로 버튼은 오른쪽 하단 모서리 근처에 있으며 오른쪽을 가리킵니다.
그림 4. 화면의 LTR 및 RTL 버전

앱에 RTL 지원을 추가할 때는 다음과 같은 요점을 염두에 두는 것이 특히 중요합니다.

  • RTL 텍스트 미러링은 Android 4.2(API 레벨 17) 이상을 실행하는 기기에 사용할 때만 앱에서 지원됩니다. 이전 버전에서 텍스트 미러링을 지원하는 방법은 이전 앱에 지원 제공을 참조하세요.
  • 앱이 RTL 텍스트 방향을 지원하는지 테스트하려면 개발자 옵션으로 테스트하고 RTL 스크립트를 사용하는 사용자에게 앱을 사용하도록 권합니다.

참고: 레이아웃 미러링과 관련된 추가적인 디자인 가이드라인(미러링해야 하는 요소와 하지 말아야 할 요소 목록 포함)을 보려면 양방향성 머티리얼 디자인 가이드라인을 참조하세요.

앱에서 RTL이 RTL 언어로 나타나도록 UI 레이아웃을 미러링하려면 다음 섹션에서 안내하는 단계를 완료하세요.

빌드와 매니페스트 파일 수정

앱 모듈의 build.gradle 파일과 앱 매니페스트 파일을 다음과 같이 수정합니다.

build.gradle (Module: app)

android {
    ...
    defaultConfig {
        targetSdkVersion 17 // Or higher
        ...
    }
}

AndroidManifest.xml

<manifest ... >
    ...
    <application ...
        android:supportsRtl="true">
    </application>
</manifest>

참고: 앱이 Android 4.1.1(API 레벨16) 이하를 대상으로 할 경우 앱 레이아웃 파일에 표시되는 모든 startend 속성 값과 함께 android:supportsRtl 속성이 무시됩니다. 이 경우 RTL 레이아웃 미러링이 앱에서 자동 실행되지 않습니다.

기존 리소스 업데이트

각 기존 레이아웃 리소스 파일에서 leftright를 각각 startend로 변환합니다. 이렇게 하면 프레임워크가 사용자의 언어 설정에 기초하여 앱의 UI 요소를 정렬할 수 있습니다.

참고: 리소스를 업데이트하기 전에 기존 앱에 지원을 제공하는 방법, 또는 Android 4.1.1(API 레벨 16) 이하를 대상으로 하는 앱에 지원을 제공하는 방법을 알아보세요.

프레임워크의 RTL 정렬 기능을 사용하려면 표 1에 있는 레이아웃 파일의 속성을 변경합니다.

표 1. 앱이 여러 텍스트 방향을 지원할 때 사용하는 속성

LTR만 지원하는 속성 LTR과 RTL을 지원하는 속성
android:gravity="left" android:gravity="start"
android:gravity="right" android:gravity="end"
android:layout_gravity="left" android:layout_gravity="start"
android:layout_gravity="right" android:layout_gravity="end"
android:paddingLeft android:paddingStart
android:paddingRight android:paddingEnd
android:drawableLeft android:drawableStart
android:drawableRight android:drawableEnd
android:layout_alignLeft android:layout_alignStart
android:layout_alignRight android:layout_alignEnd
android:layout_marginLeft android:layout_marginStart
android:layout_marginRight android:layout_marginEnd
android:layout_alignParentLeft android:layout_alignParentStart
android:layout_alignParentRight android:layout_alignParentEnd
android:layout_toLeftOf android:layout_toStartOf
android:layout_toRightOf android:layout_toEndOf

표 2는 대상 SDK 버전, leftright 속성이 정의되었는지 여부, startend 속성이 정의되었는지 여부에 따라 시스템이 UI 정렬 속성을 처리하는 방법을 보여줍니다.

표 2. 대상 SDK 버전과 정의된 속성에 기초한 UI 요소 정렬 동작

Android 4.2
(API 레벨 17) 이상을 대상으로 합니까?
오른쪽과 왼쪽이 정의되었습니까? 시작과 종료가 정의되었습니까? 결과
startend를 분석하고 leftright를 재정의
아니요 leftright만 사용
아니요 startend만 사용
아니요 leftright 사용(startend 무시)
아니요 아니요 leftright만 사용
아니요 아니요 startendleftright로 분석됨

방향 및 언어별 리소스 추가

이 단계에서는 여러 언어와 텍스트 방향에 대한 맞춤 설정된 값을 포함한 레이아웃, 드로어블, 값 리소스 파일의 특정 버전을 추가합니다.

Android 4.2(API 레벨17) 이상에서 -ldrtl(layout-direction-right-to-left)과 -ldltr(layout-direction-left-to-right) 리소스 한정자를 사용할 수 있습니다. 기존 리소스를 로딩할 때 이전 버전과의 호환성을 유지하기 위해 구 버전 Android는 리소스의 언어 한정자를 사용하여 올바른 텍스트 방향을 유추합니다.

RTL 스크립트(예: 히브리어, 아랍어, 페르시아어)를 지원하기 위한 특정 레이아웃 파일을 추가한다고 생각해보세요. 이를 위해서는 다음 예시와 같이 res/ 디렉토리에 layout-ldrtl/ 디렉토리를 추가합니다.

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ldrtl/
        main.xml This layout file is loaded for languages using an
                 RTL text direction, including Arabic, Persian, and Hebrew.

아랍어 텍스트에 맞게 디자인된 특정 버전 레이아웃을 추가하고 싶다면 디렉토리 구조가 다음과 같이 됩니다.

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ar/
        main.xml This layout file is loaded for Arabic text.
    layout-ldrtl/
        main.xml This layout file is loaded only for non-Arabic
                 languages that use an RTL text direction.

참고: 언어별 리소스는 레이아웃 방향별 리소스보다 우선되고, 레이아웃 방향별 리소스는 기본 리소스보다 우선됩니다.

지원되는 위젯 사용

Android 4.2(API 레벨 17)부터 대부분 프레임워크 UI 요소는 RTL 텍스트 방향을 자동 지원합니다. 그러나 여러 프레임워크 요소(예: ViewPager)가 RTL 텍스트 방향을 지원하지 않습니다.

홈 화면 위젯은 해당 매니페스트 파일에 속성 할당 android:supportsRtl="true"가 포함되어 있는 경우 RTL 텍스트 방향을 지원합니다.

기존 앱에 지원 제공

앱이 Android 4.1.1(API 레벨 16) 이하를 대상으로 할 경우 startend 속성 외에 leftright도 포함합니다.

레이아웃이 RTL 텍스트 방향을 사용해야 하는지 확인하려면 다음 로직을 사용하세요.

Kotlin

private fun shouldUseLayoutRtl(): Boolean {
    return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        View.LAYOUT_DIRECTION_RTL == layoutDirection
    } else {
        false
    }
}

Java

private boolean shouldUseLayoutRtl() {
    if (android.os.Build.VERSION.SDK_INT >=
            android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        return View.LAYOUT_DIRECTION_RTL == getLayoutDirection();
    } else {
        return false;
    }
}

참고: 호환성 문제를 예방하려면 Android SDK Build Tools 23.0.1 버전 이상을 사용하세요.

개발자 옵션을 사용한 테스트

Android 4.4(API 레벨 19) 이상을 대상으로 하는 기기는 기기 내 개발자 옵션에서 Force RTL 레이아웃 방향을 활성화할 수 있습니다. 이 설정을 사용하면 LTR 스크립트(예: 영어 텍스트)를 사용하는 텍스트를 RTL 모드로 볼 수 있습니다.

앱 로직 업데이트

이 섹션에서는 여러 텍스트 방향을 처리하기 위해 앱을 수정할 때 업데이트해야 하는 앱 로직이 무엇인지 설명합니다.

속성 변경사항

RTL 관련 속성(예: 레이아웃 방향, 레이아웃 매개변수, 안쪽 여백, 텍스트 방향, 텍스트 정렬 또는 드로어블 위치 지정)의 변경사항을 처리할 때는 onRtlPropertiesChanged() 콜백을 사용할 수 있습니다. 이 콜백을 통해 현재 레이아웃 방향을 감지하고 그에 맞게 Activity의 View 객체를 업데이트할 수 있습니다.

Activity의 뷰 계층 구조에 직접 포함되지 않은 UI 위젯을 생성할 경우(예: 대화상자 또는 토스트형 UI 요소) 컨텍스트에 따라 올바른 레이아웃 방향을 설정해야 합니다. 다음 코드 스니펫은 이 과정을 완료하는 방법을 알려줍니다.

Kotlin

val config: Configuration = context.resources.configuration
view.layoutDirection = config.layoutDirection

Java

final Configuration config =
    getContext().getResources().getConfiguration();
view.setLayoutDirection(config.getLayoutDirection());

View 클래스에는 추가적인 고려 사항이 필요한 메서드가 여러 개 있습니다.

onMeasure()
뷰 측정값은 텍스트 방향에 따라 다를 수 있습니다.
onLayout()
자체적인 레이아웃 구현을 생성할 경우 자체 onLayout() 버전에서 super()를 호출하고 RTL 스크립트를 지원하도록 맞춤 로직을 수정해야 합니다.
onDraw()
맞춤 뷰를 구현하거나 그리기에 고급 기능을 추가할 때는 RTL 스크립트를 지원하도록 코드를 업데이트해야 합니다. 다음 코드를 사용하여 위젯이 RTL 모드인지 확인할 수 있습니다.

Kotlin

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
fun isLayoutRtl(): Boolean = layoutDirection == LAYOUT_DIRECTION_RTL

Java

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
public boolean isLayoutRtl() {
    return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
}

드로어블

RTL 레이아웃에 대해 미러링해야 하는 드로어블이 있다면 기기에서 실행되는 Android 버전에 기초하여 다음 단계 중 하나를 완료하세요.

  • Android 4.3(API 레벨 18) 이하를 실행하는 기기에서 -ldrtl 리소스 파일을 추가 및 정의해야 합니다.
  • Android 4.4(API 레벨19) 이상에서 드로어블을 정의할 때 android:autoMirrored="true"를 사용할 수 있습니다. 그러면 시스템이 RTL 레이아웃 미러링을 대신 처리할 수 있습니다.

    참고: android:autoMirrored 속성은 양방향 미러링이 전체 드로어블의 그래픽 미러링에 불과한 단순한 드로어블에만 적용됩니다. 드로어블에 여러 가지 요소가 포함되거나 드로어블을 미러링했을 때 해석이 바뀌게 될 경우, 개발자가 미러링을 직접 수행해야 합니다. 가능하면 양방향 전문가에게 미러링된 드로어블을 사용자가 이해할 수 있는지 확인하세요.

중력

앱 코드가 Gravity.LEFT 또는 Gravity.RIGHT를 사용할 경우 이 값을 각각 Gravity.STARTGravity.END로 변경해야 합니다.

예를 들어 다음 코드를 사용할 경우

Kotlin

when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

Java

switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

...다음과 같이 변경해야 합니다.

Kotlin

val absoluteGravity: Int = Gravity.getAbsoluteGravity(gravity, layoutDirection)
when (absoluteGravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

Java

final int layoutDirection = getLayoutDirection();
final int absoluteGravity =
        Gravity.getAbsoluteGravity(gravity, layoutDirection);
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

즉, 중력 값에 startend를 사용하더라도 왼쪽 정렬 및 오른쪽 정렬 값을 처리하는 기존 코드를 그대로 사용할 수 있습니다.

참고: 중력 설정을 적용할 때 layoutDirection 인수를 포함한 Gravity.apply() 오버로드 버전을 사용하세요.

여백과 안쪽 여백

앱에서 RTL 스크립트를 지원하려면 여백 및 안쪽 여백 값과 관련된 모범 사례를 따르세요.

참고 항목