openplanning

Hướng dẫn và ví dụ Android CharacterPickerDialog

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

Nhóm phát triển của chúng tôi vừa ra mắt website langlearning.net học tiếng Anh, Nga, Đức, Pháp, Việt, Trung, Hàn, Nhật, ... miễn phí cho tất cả mọi người.
Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất.
Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi.
Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

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: