Mendukung berbagai bahasa dan budaya

Aplikasi menyertakan resource yang mungkin dikhususkan untuk budaya tertentu. Contohnya, aplikasi bisa menyertakan string spesifik budaya yang diterjemahkan ke dalam bahasa lokal saat ini. Sebaiknya, biarkan resource spesifik budaya ini terpisah dari hal lain yang ada dalam aplikasi Anda. Android menangani resource spesifik bahasa dan budaya berdasarkan setelan lokal sistem saat ini. Anda bisa memberikan dukungan untuk berbagai lokal menggunakan direktori resource dalam project Android.

Anda bisa menentukan resource yang disesuaikan dengan budaya pengguna aplikasi Anda. Anda bisa menyediakan jenis resource apa pun yang sesuai untuk bahasa dan budaya pengguna. Misalnya, screenshot berikut menunjukkan aplikasi yang menampilkan string dan resource yang dapat digambar dalam lokal default perangkat (en_US) dan lokal bahasa Spanyol (es_ES).

Aplikasi menampilkan teks dan ikon yang berbeda menurut lokal saat ini

Gambar 1. Aplikasi menggunakan resource yang berbeda menurut lokal saat ini

Jika Anda membuat project menggunakan Android SDK Tools (baca Membuat Project Android), fitur ini akan membuat direktori res/ pada level atas project. Dalam direktori res/ ini, terdapat subdirektori dari berbagai jenis resource. Ada juga beberapa file default seperti res/values/strings.xml yang menyimpan nilai string Anda.

Mendukung berbagai bahasa akan lebih bermanfaat daripada sekadar menggunakan resource spesifik lokal. Beberapa pengguna memilih bahasa yang menggunakan skrip kanan-ke-kiri (RTL) untuk lokal UI mereka, seperti bahasa Arab atau Ibrani. Pengguna lainnya melihat atau membuat konten dalam bahasa yang menggunakan skrip RTL, meskipun mereka sudah menyetel bahasa yang menggunakan skrip LTR sebagai lokal UI mereka, seperti bahasa Inggris. Untuk mendukung kedua jenis pengguna ini, aplikasi Anda harus memenuhi hal-hal berikut:

  • Menggunakan tata letak UI RTL untuk lokal RTL.
  • Mendeteksi dan mendeklarasikan arah data teks yang ditampilkan dalam pesan yang diformat. Biasanya, Anda cukup memanggil sebuah metode yang akan menentukan arah data teks untuk Anda.

Membuat file resource dan direktori lokal

Untuk menambahkan dukungan bagi lebih banyak lokal, buat direktori tambahan dalam res/. Setiap nama direktori harus mengikuti format berikut:

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

Misalnya, values-b+es/ berisi resource string untuk lokal yang memiliki kode bahasa es. Demikian pula, mipmap-b+es+ES/ berisi ikon untuk lokal yang memiliki kode bahasa es dan kode negara ES. Android memuat resource yang sesuai menurut setelan lokal perangkat pada waktu proses. Untuk informasi selengkapnya, lihat Menyediakan Resource Alternatif.

Setelah memutuskan lokal yang akan didukung, buat file dan subdirektori resource. Misalnya:

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

Contohnya, berikut adalah beberapa file resource untuk bahasa yang berbeda:

String bahasa Inggris (lokal default), /values/strings.xml:

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

String bahasa Spanyol (lokal es), /values-es/strings.xml:

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

Ikon bendera Amerika Serikat (lokal default), /mipmap/country_flag.png:

Ikon bendera Amerika Serikat

Gambar 2. Ikon yang digunakan untuk lokal default (en_US)

Ikon bendera Spanyol (lokal es_ES), /mipmap-b+es+ES/country_flag.png:

Ikon bendera Spanyol

Gambar 3. Ikon yang digunakan untuk lokal es_ES

Catatan: Anda bisa menggunakan qualifier lokal (atau qualifier konfigurasi apa pun) pada setiap jenis resource, seperti jika Anda ingin menyediakan versi resource yang dapat digambar bitmap yang dilokalkan. Untuk informasi selengkapnya, lihat Pelokalan.

Menggunakan resource dalam aplikasi

Anda bisa mereferensikan resource dalam kode sumber dan file XML lainnya menggunakan atribut name milik setiap resource.

Dalam kode sumber, Anda bisa merujuk ke resource menggunakan sintaksis R.<resource type>.<resource name>. Ada berbagai metode yang menerima resource dengan cara ini.

Contoh:

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);
    

Dalam file XML lainnya, Anda bisa merujuk ke resource dengan sintaksis @<resource type>/<resource name> setiap kali atribut XML menerima nilai yang kompatibel.

Contoh:

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

Memformat teks dalam pesan

Salah satu tugas yang paling umum dalam aplikasi adalah memformat teks. Pesan yang dilokalkan diformat dengan memasukkan data teks dan numerik ke posisi yang sesuai. Sayangnya, ketika menangani UI RTL atau data RTL, pemformatan sederhana bisa menampilkan output teks yang salah atau bahkan tidak bisa dibaca.

Bahasa seperti Arab, Ibrani, Persia, dan Urdu ditulis dalam arah RTL secara keseluruhan. Namun, beberapa elemennya, seperti angka dan teks LTR yang tersemat, ditulis dalam arah LTR di dalam teks RTL yang sebaliknya. Bahasa yang menggunakan skrip LTR, termasuk bahasa Inggris, juga bersifat dua arah karena bisa memuat skrip RTL tersemat yang perlu ditampilkan dalam arah RTL.

Sering kali, aplikasi justru menghasilkan instance seperti yang dimaksud dari teks arah berlawanan yang tersemat. Aplikasi menyisipkan data teks dari bahasa yang berubah-ubah, serta arah teks yang berubah-ubah, ke dalam pesan yang dilokalkan. Pencampuran arah ini sering kali tidak menyertakan indikasi yang jelas tentang tempat teks arah berlawanan dimulai dan berakhir. Karakteristik teks yang dihasilkan aplikasi ini sering menjadi penyebab munculnya masalah.

Meskipun penanganan default sistem terhadap teks dua arah biasanya bisa merender teks sesuai yang diharapkan, teks mungkin tidak dirender dengan benar ketika aplikasi menyisipkannya ke dalam pesan yang dilokalkan. Situasi berikut ini menampilkan contoh kasus ketika teks tersebut kemungkinan tidak muncul dengan benar:

  • Disisipkan di bagian paling awal pada pesan:

    PERSON_NAME menelepon Anda

  • Dimulai dengan angka, seperti dalam alamat atau nomor telepon:

    987 654-3210

  • Dimulai dengan tanda baca, seperti dalam nomor telepon:

    +19876543210

  • Berakhiran dengan tanda baca:

    Apakah Anda yakin?

  • Sudah memuat kedua arah:

    Kata בננה dalam bahasa Ibrani berarti pisang.

Contoh

Misalnya, anggaplah suatu aplikasi terkadang perlu menampilkan pesan "Apakah maksud Anda %s?", dengan alamat yang disisipkan menggantikan %s pada waktu proses. Karena aplikasi mendukung berbagai lokal UI, pesan tersebut masuk dari resource spesifik lokal dan menggunakan arah RTL ketika lokal RTL sedang digunakan. Untuk UI bahasa Ibrani, tampilannya seharusnya akan seperti ini:

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

Namun, saran yang diberikan mungkin berasal dari database yang tidak menyertakan teks dalam bahasa lokal tersebut. Misalnya, jika alamat yang dimaksud adalah sebuah tempat di California, alamat akan muncul dalam database menggunakan teks bahasa Inggris. Jika Anda menyisipkan alamat "15 Bay Street, Laurel, CA" ke dalam pesan RTL tersebut tanpa memberikan petunjuk terkait arah teks, hasilnya akan menjadi tidak terduga atau tidak benar:

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

Perlu diketahui bahwa nomor rumah muncul di sebelah kanan alamat, bukan di sebelah kiri seperti yang dimaksud, dan nomor rumah tersebut tampak lebih mirip dengan kode pos yang aneh. Masalah yang sama bisa terjadi jika Anda menyertakan teks RTL dalam pesan yang menggunakan arah teks LTR.

Penjelasan dan solusinya

Masalah dalam contoh sebelumnya terjadi karena pemformat teks tidak menentukan bahwa "15" adalah bagian dari alamat sehingga sistem tidak bisa menentukan apakah "15" merupakan bagian dari teks RTL yang muncul sebelumnya atau teks LTR yang muncul setelahnya.

Untuk mengatasi masalah ini, gunakan metode unicodeWrap() yang ada dalam class BidiFormatter, pada setiap bagian teks yang disisipkan ke pesan yang dilokalkan. Satu-satunya waktu saat Anda tidak boleh menggunakan unicodeWrap() adalah sebagai berikut:

  • Teks akan disisipkan ke string yang bisa dibaca mesin, seperti URI atau kueri SQL.
  • Anda tahu bahwa potongan teks tersebut sudah dilengkapi dengan benar.

Metode unicodeWrap() mendeteksi arah string dan memasukkannya ke dalam karakter pemformatan Unicode yang mendeklarasikan arah tersebut. Karena "15" sekarang muncul dalam teks yang dideklarasikan sebagai LTR, angka tersebut ditampilkan pada posisi yang benar:

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

Cuplikan kode berikut menunjukkan cara menggunakan 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));
    

Catatan: Jika aplikasi menargetkan Android 4.3 (API level 18) atau yang lebih tinggi, gunakan versi BidiFormatter yang ada dalam Framework Android. Jika tidak, gunakan versi BidiFormatter yang ada dalam Support Library.

Memformat angka

Gunakan string format, bukan panggilan metode, untuk mengonversi angka menjadi string dalam logika aplikasi Anda:

Kotlin

    var myIntAsString = "$myInt"
    

Java

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

Tindakan ini akan memformat angka sesuai lokal Anda, yang mungkin mencakup penggunaan rangkaian digit yang berbeda.

Saat menggunakan String.format() untuk membuat kueri SQL pada perangkat yang lokalnya menggunakan rangkaian digitnya sendiri, seperti Persia dan sebagian besar lokal Arab, masalah akan terjadi jika salah satu parameter kueri berupa angka. Hal ini dikarenakan angka diformat dalam digit lokal, dan digit ini tidak valid dalam SQL.

Untuk mempertahankan angka yang diformat ASCII dan mempertahankan agar kueri SQL tetap valid, Anda harus menggunakan versi String.format() yang kelebihan muatan yang menyertakan lokal sebagai parameter pertama. Argumen lokal harus berupa Locale.US.

Mendukung pencerminan tata letak

Pengguna skrip RTL akan lebih menyukai antarmuka pengguna RTL yang menyertakan menu rata kanan, teks rata kanan, dan panah maju yang menghadap ke kiri.

Gambar 4 menunjukkan perbedaan antara versi layar LTR dalam aplikasi Setelan dan kebalikannya dalam RTL:

Area notifikasi diratakan ke kanan di dekat sudut kanan atas, tombol menu di kolom aplikasi ada di dekat sudut kiri atas, konten di bagian utama layar diratakan ke kiri dan ditampilkan secara LTR, dan tombol kembali terletak di dekat sudut kiri bawah serta menunjuk ke kiri. Area notifikasi diratakan ke kiri di dekat sudut kiri atas, tombol menu di kolom aplikasi ada di dekat sudut kanan atas, konten di bagian utama layar diratakan ke kanan dan ditampilkan secara RTL, dan tombol kembali terletak di dekat sudut kanan bawah serta menunjuk ke kanan.
Gambar 4. Varian LTR dan RTL layar

Saat menambahkan dukungan RTL ke aplikasi Anda, penting untuk selalu mengingat hal-hal berikut:

  • Pencerminan teks RTL hanya didukung dalam aplikasi ketika digunakan di perangkat yang menjalankan Android 4.2 (API level 17) atau lebih tinggi. Untuk mempelajari cara mendukung pencerminan teks di perangkat yang lebih lama, lihat Memberikan dukungan untuk aplikasi lama.
  • Untuk menguji apakah aplikasi mendukung arah teks RTL, uji menggunakan opsi developer dan undang pengguna skrip RTL untuk menggunakan aplikasi Anda.

Catatan: Untuk melihat panduan desain tambahan terkait pencerminan tata letak, termasuk daftar elemen yang harus dan tidak boleh Anda cerminkan, lihat panduan desain material Bidireksionalitas.

Untuk mencerminkan tata letak UI dalam aplikasi sehingga tampak sebagai RTL dalam lokal RTL, selesaikan langkah-langkah di bagian berikut ini.

Mengubah file build dan manifes

Ubah file build.gradle dalam modul aplikasi dan file manifes aplikasi seperti berikut:

build.gradle (Module: app)

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

AndroidManifest.xml

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

Catatan: Jika aplikasi Anda menargetkan Android 4.1.1 (API level 16) atau yang lebih rendah, atribut android:supportsRtl akan diabaikan, beserta setiap nilai atribut start dan end yang muncul dalam file tata letak aplikasi Anda. Apabila ini terjadi, pencerminan tata letak RTL tidak terjadi secara otomatis dalam aplikasi.

Mengupdate resource yang ada

Ubah masing-masing left dan right ke start dan end, dalam setiap file resource tata letak yang sudah ada. Dengan begitu, Anda mengizinkan framework untuk menyelaraskan elemen UI aplikasi berdasarkan setelan bahasa pengguna.

Catatan: Sebelum mengupdate resource, pelajari cara memberikan dukungan untuk aplikasi lama, atau aplikasi yang menargetkan Android 4.1.1 (API level 16) dan yang lebih rendah.

Untuk menggunakan kemampuan penyelarasan RTL framework, ubah atribut dalam file tata letak yang ada dalam Tabel 1.

Tabel 1. Atribut yang akan digunakan ketika aplikasi mendukung beberapa arah teks

Atribut yang hanya mendukung LTR Atribut yang mendukung LTR dan 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

Tabel 2 menunjukkan bagaimana sistem menangani atribut penyelarasan UI berdasarkan versi SDK target, baik apakah atribut left dan right sudah ditentukan, dan apakah atribut start dan end sudah ditentukan.

Tabel 2. Perilaku penyelarasan elemen UI berdasarkan versi SDK target dan atribut yang ditentukan

Menargetkan Android 4.2
(API level 17) atau lebih tinggi?
Kiri dan kanan ditentukan? Awal dan akhir ditentukan? Hasil
Ya Ya Ya start dan end di-resolve, lalu menggantikan left dan right
Ya Ya Tidak Hanya left dan right yang digunakan
Ya Tidak Ya Hanya start dan end yang digunakan
Tidak Ya Ya left dan right digunakan (start dan end diabaikan)
Tidak Ya Tidak Hanya left dan right yang digunakan
Tidak Tidak Ya start dan end di-resolve ke left dan right

Menambahkan resource spesifik arah dan bahasa

Langkah ini melibatkan penambahan versi spesifik tata letak, resource yang dapat digambar, dan file resource nilai yang berisi nilai kustom untuk berbagai bahasa dan arah teks.

Di Android 4.2 (API level 17) dan yang lebih tinggi, Anda bisa menggunakan qualifier resource -ldrtl (layout-direction-right-to-left) dan -ldltr (layout-direction-left-to-right). Untuk mempertahankan kompatibilitas mundur dengan pemuatan resource yang ada, versi lama Android menggunakan qualifier bahasa resource untuk menyimpulkan arah teks yang benar.

Anggaplah Anda ingin menambahkan file tata letak spesifik untuk mendukung skrip RTL, seperti bahasa Ibrani, Arab, dan Persia. Untuk melakukannya, tambahkan direktori layout-ldrtl/ dalam direktori res/, seperti yang ditunjukkan dalam contoh berikut ini:

    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.
    

Jika ingin menambahkan versi tata letak spesifik yang didesian hanya untuk teks bahasa Arab, struktur direktori Anda akan menjadi seperti berikut:

    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.
    

Catatan: Resource spesifik bahasa lebih diutamakan daripada resource spesifik arah tata letak, yang lebih diutamakan daripada resource default.

Mengunakan widget yang didukung

Sejak Android 4.2 (API level 17), hampir semua elemen UI framework mendukung arah teks RTL secara otomatis. Namun, beberapa elemen framework, seperti ViewPager, tidak mendukung arah teks RTL.

Widget layar utama mendukung arah teks RTL selama file manifes miliknya yang terkait menyertakan penerapan atribut android:supportsRtl="true"

Memberikan dukungan untuk aplikasi lama

Jika aplikasi Anda menargetkan Android 4.1.1 (API level 16) atau yang lebih rendah, sertakan juga atribut left dan right selain start dan end.

Untuk memeriksa apakah tata letak Anda harus menggunakan arah teks RTL, gunakan logika berikut:

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;
        }
    }
    

Catatan: Untuk menghindari masalah kompatibilitas, gunakan versi 23.0.1 atau yang lebih tinggi untuk Android SDK Build Tools.

Menguji menggunakan opsi developer

Di perangkat yang menjalankan Android 4.4 (API level 19) atau yang lebih tinggi, Anda bisa mengaktifkan Paksa arah tata letak RTL dalam opsi developer di perangkat. Setelan ini memungkinkan Anda melihat teks yang menggunakan skrip LTR, seperti teks bahasa Inggris, dalam mode RTL.

Mengupdate logika aplikasi

Bagian ini menjelaskan tempat tertentu dalam logika aplikasi Anda yang harus diupdate saat menyesuaikan aplikasi untuk menangani beberapa arah teks.

Perubahan properti

Untuk menangani perubahan dalam properti terkait RTL apa pun, seperti arah tata letak, parameter tata letak, padding, arah teks, perataan teks, atau pemosisian resource yang dapat digambar, Anda bisa menggunakan callback onRtlPropertiesChanged(). Callback ini memungkinkan Anda mendapatkan arah tata letak saat ini kemudian mengupdate objek View aktivitas.

Tampilan

Jika Anda membuat widget UI yang tidak secara langsung menjadi bagian dari hierarki tampilan aktivitas, seperti dialog atau elemen UI yang mirip dengan toast, setel arah tata letak yang benar menurut konteksnya. Cuplikan kode berikut menunjukkan cara menyelesaikan proses ini:

Kotlin

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

Java

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

Beberapa metode class View memerlukan pertimbangan lainnya:

onMeasure()
Ukuran tampilan dapat bervariasi menurut arah teks.
onLayout()
Jika membuat implementasi tata letak sendiri, Anda harus memanggil super() dalam versi onLayout() dan menyesuaikan logika kustom agar mendukung skrip RTL.
onDraw()
Jika mengimplementasikan tampilan kustom atau menambahkan fungsionalitas lanjutan ke gambar, Anda harus mengupdate kode agar mendukung skrip RTL. Gunakan kode berikut ini untuk menentukan apakah widget Anda berada dalam mode 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);
    }
    

Resource yang dapat digambar

Jika memiliki resource yang dapat digambar yang perlu dicerminkan untuk tata letak RTL, selesaikan salah satu langkah ini berdasarkan versi Android yang berjalan di perangkat:

  • Di perangkat yang menjalankan Android 4.3 (API level 18) dan yang lebih rendah, Anda harus menambahkan dan menentukan file resource -ldrtl.
  • Pada Android 4.4 (API level 19) dan yang lebih tinggi, Anda bisa menggunakan android:autoMirrored="true" saat menentukan resource yang dapat digambar, yang memungkinkan sistem menangani pencerminan tata letak RTL untuk Anda.

    Catatan: Atribut android:autoMirrored hanya berfungsi untuk resource yang dapat digambar sederhana yang pencerminan bidireksionalnya hanyalah pencerminan grafis dari seluruh resource yang dapat digambar. Jika resource dapat digambar Anda berisi banyak elemen, atau jika pencerminan akan mengubah interpretasinya, Anda harus melakukan pencerminan sendiri. Kapan pun jika memungkinkan, tanyakan kepada pakar bidireksional untuk menentukan apakah resource yang dapat digambar milik Anda yang dicerminkan dapat diterima oleh pengguna.

Gravitasi

Jika kode aplikasi Anda menggunakan Gravity.LEFT atau Gravity.RIGHT, Anda harus mengubah nilai ini masing-masing menjadi Gravity.START dan Gravity.END.

Misalnya, jika menggunakan kode berikut ini:

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;
    }
    

...Anda harus mengubahnya menjadi seperti berikut:

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;
    }
    

Artinya, Anda bisa mempertahankan kode saat ini yang menangani nilai rata kiri dan rata kanan meskipun menggunakan start dan end untuk nilai gravitasi.

Catatan: Saat menerapkan setelan gravitasi, gunakan versi Gravity.apply() yang kelebihan muatan yang menyertakan argumen layoutDirection.

Margin dan padding

Untuk mendukung skrip RTL dalam aplikasi, ikuti praktik terbaik mengenai nilai margin dan padding ini:

Lihat juga