Hướng dẫn sử dụng Android CharacterPickerDialog

Xem thêm các chuyên mục:

1- Android CharacterPickerDialog

Android CharacterPickerDialog là một hộp thoại cho phép người dùng lựa chọn "các ký tự có dấu" (accented characters) của một ký tự cơ sở. Đôi khi CharacterPickerDialog rất có ích bởi vì không phải tất cả điện thoại của người dùng đều sẵn có một bố cục bàn phím ( Keyboard Layout) phù hợp cho một ngôn ngữ cụ thể.
Ví dụ, tiếng Việt có một danh sách rất nhiều các ký tự có dấu (accented characters), nó có thể khá lạ lẫm đối với bạn:

a á à ã ả ạ ă ắ ằ ẵ ẳ ặ â ấ ầ ẫ ẩ ậ
A Á À Ã Ả Ạ Ă Ắ Ằ Ẵ Ẳ Ặ Â Ấ Ầ Ẫ Ẩ Ậ
d đ
D Đ
e é è ẽ ẻ ẹ ê ế ề ễ ể ệ
E É È Ẽ Ẻ Ẹ Ê Ế Ề Ễ Ể Ệ
i í ì ĩ ỉ ị
I Í Ì Ĩ Ỉ Ị
o ó ò õ ỏ ọ ô ố ồ ỗ ổ ộ ơ ớ ờ ỡ ở ợ
O Ó Ò Õ Ỏ Ọ Ô Ố Ồ Ỗ Ổ Ộ Ơ Ớ Ờ Ỡ Ở Ợ
u ú ù ũ ủ ụ ư ứ ừ ữ ử ự
U Ú Ù Ũ Ủ Ụ Ư Ứ Ừ Ữ Ử Ự
y ý ỳ ỹ ỷ ỵ
Y Ý Ỳ Ỹ Ỷ Ỵ

Một số ký tự đặc biệt trong tiếng Đức:
  

ä ö ü ß

Một số ký tự đặc biệt trong tiếng Pháp:

à â æ ç é è ê ë ï î ô œ ù û ü ÿ

2- Ví dụ CharacterPickerDialog

Dưới đây là một ứng dụng đơn giản sử dụng CharacterPickerDialog để hỗ trợ người dùng lựa chọn các ký tự đặc biệt trong tiếng Việt.
Trên Android Studio tạo một project:
  • File > New > New Project > Empty Activity
    • Name: CharacterPickerDialogExample
    • Package name: org.o7planning.characterpickerexample
    • Language: Java
Giao diện của ứng dụng:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="Enter your name:"
        android:textSize="22sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="51dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package org.o7planning.characterpickerdialogexample;

import android.os.Bundle;
import android.text.Editable;
import android.text.method.CharacterPickerDialog;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private static final String LOG_TAG  = "AndroidExample";

    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.editText = this.findViewById(R.id.editText);
        this.editText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                return handleOnKey(  keyCode,   event);
            }
        });
    }

    private boolean handleOnKey(int keyCode, KeyEvent event)  {
        if(event.getAction() == KeyEvent.ACTION_DOWN) {
            return false;
        }

        char base = (char) event.getUnicodeChar();
        Log.i(LOG_TAG, "keyCode: " + keyCode + ", Base character: " + base);

        final String accentedString = AccentedStringUtils.getAccentedString(base);
        if(accentedString == null)  {
            return false;
        }
        final Editable editable = this.editText.getText();

        CharacterPickerDialog dialog= new CharacterPickerDialog(this, new View(this), editable, accentedString,false) {
            // User click on Cancel button.
            @Override
            public void onClick (View v) {
                // Do something here
                // ...
                super.onClick(v);
            }

            // User click on Character button.
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id){
                // Do something here
                // ...
                super.onItemClick(parent, view, position, id);
            }
        };
        dialog.show();

        return false;
    }

}
AccentedStringUtils.java
package org.o7planning.characterpickerdialogexample;

public class AccentedStringUtils {

    //
    // Vietnamese special characters.
    //
    private static final String[] ACCENTED_STRINGS = {
            "aáàãảạăắằẵẳặâấầẫẩậ",
            "AÁÀÃẢẠĂẮẰẴẲẶÂẤẦẪẨẬ",
            "dđ",
            "DĐ",
            "eéèẽẻẹêếềễểệ",
            "EÉÈẼẺẸÊẾỀỄỂỆ",
            "iíìĩỉị",
            "IÍÌĨỈỊ",
            "oóòõỏọôốồỗổộơớờỡởợ",
            "OÓÒÕỎỌÔỐỒỖỔỘƠỚỜỠỞỢ",
            "uúùũủụưứừữửự",
            "UÚÙŨỦỤƯỨỪỮỬỰ",
            "yýỳỹỷỵ",
            "YÝỲỸỶỴ"
    };

    public static String getAccentedString(char base)  {
         for(int i = 0; i< ACCENTED_STRINGS.length; i++) {
             String accentedString = ACCENTED_STRINGS[i];
             if(accentedString.charAt(0) == base)  {
                 return accentedString;
             }
         }
         return null;
    }
}

Xem thêm các chuyên mục: