Bài 14. TextView, EditText, Button trong Android phần 2


Như vậy ở bài 13 Tui đã hướng dẫn các bạn lý thuyết về bộ 3 nguy hiểm TextView, EditText, Button. Bài này Tui sẽ ứng dụng nó để làm 1 tiện ích nho nhỏ đó là “Đọc số tiền bằng chữ”. Ví dụ khi người dùng nhập vào số tiền “8767543” -> “Tám triệu bảy trăm sáu mươi bảy nghìn năm trăm bốn mươi ba”

Tạo một dự án tên “DocTienBangChu”, thiết kế giao diện như hình dưới đây:

XML Layout code như sau:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:background="#fff120"
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Nhập số tiền bằng Số:" />

    <EditText
        android:id="@+id/editNumberOfMoney"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="number" />

    <Button
        android:id="@+id/btnDocTien"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Đọc Tiền" />

    <TextView
        android:id="@+id/txtTextOfMoney"
        android:layout_width="match_parent"
        android:layout_height="151dp"
        android:background="#fff120"
        android:text="" />
</LinearLayout>

Tiến hành cấu hình ViewBinding cho dự án, bạn nào chưa học bài ViewBinding thì xem lại bài 12.

Tiếp theo bấm chuột phải vào java/chọn new/ chọn package:

Màn hình Choose Destination Directory xuất hiện như dưới đây:

Chọn app\src\main\java

Rồi bấm OK:

Nhập package name là: tranduythanh.com.utils rồi nhấn Enter.

Ta thấy package utils xuất hiện ra như trên. Bây giờ tạo thư viện để đọc Tiền bằng số ra chữ (trên mạng có nhiều, thích tham khảo ở đâu cũng được, miễn là nó chạy đúng, ví dụ có thể tham khảo tại đây, mã nguồn bên dưới Tui cũng tham chiếu từ link đó cho các bạn dễ đọc):

Sau đó tạo một lớp tên là MoneyConverter:

Đặt tên xong thì double click vào Class, ta thấy kết quả như dưới đây:

Bây giờ tiến hành coding để đọc 1 số tiền bằng số ra chữ. Dĩ nhiên ta không phải học kỹ thuật đọc chữ thế nào, mà ta chỉ ứng dụng nó để làm việc với TextView , EditText, Button nên Tui sẽ bỏ qua bước giải thích thuật toán này (chi tiết bạn xem tại link ).

Dưới đây là coding MoneyConverter mà Tui có cấu trúc lại chút đỉnh:

package tranduythanh.com.utils;
import java.util.ArrayList;
import java.util.Arrays;
public class MoneyConverter {
    private static final String KHONG = "không";
    private static final String MOT = "một";
    private static final String HAI = "hai";
    private static final String BA = "ba";
    private static final String BON = "bốn";
    private static final String NAM = "năm";
    private static final String SAU = "sáu";
    private static final String BAY = "bảy";
    private static final String TAM = "tám";
    private static final String CHIN = "chín";
    private static final String LAM = "lăm";
    private static final String LE = "lẻ";
    private static final String MUOI = "mươi";
    private static final String MUOIF = "mười";
    private static final String MOTS = "mốt";
    private static final String TRAM = "trăm";
    private static final String NGHIN = "nghìn";
    private static final String TRIEU = "triệu";
    private static final String TY = "tỷ";
    private static final String [] number = {KHONG, MOT, HAI, BA,
            BON, NAM, SAU, BAY, TAM, CHIN};
    public static String TextOfMoney(String numberOfMoney)
    {
        ArrayList<String> kq = new ArrayList<String>();
        //Cắt chuổi string chử số ra thành các chuổi nhỏ 3 chử số
        ArrayList<String> List_Num = Split(numberOfMoney, 3);
        while (List_Num.size() != 0)
        {
            //Xét 3 số đầu tiên của chuổi (số đầu tiên của List_Num)
            switch (List_Num.size() % 3)
            {
                //3 số đó thuộc hàng trăm
                case 1:
                    kq.addAll(read_3num(List_Num.get(0)));
                    break;
                // 3 số đó thuộc hàng nghìn
                case 2:
                    ArrayList<String> nghin = read_3num(List_Num.get(0));
                    if(!nghin.isEmpty()){
                        kq.addAll(nghin);
                        kq.add(NGHIN);
                    }
                    break;
                //3 số đó thuộc hàng triệu
                case 0:
                    ArrayList<String> trieu = read_3num(List_Num.get(0));
                    if(!trieu.isEmpty()) {
                        kq.addAll(trieu);
                        kq.add(TRIEU);
                    }
                    break;
            }
            //Xét nếu 3 số đó thuộc hàng tỷ
            if (List_Num.size() == (List_Num.size() / 3) * 3 + 1 && List_Num.size() != 1) kq.add(TY);
            //Xóa 3 số đầu tiên để tiếp tục 3 số kế
            List_Num.remove(0);
        }
        String textResult=String.join(" ",kq);
        return textResult;
    }
    //Đọc 3 số
    private static ArrayList<String> read_3num(String a)
    {
        ArrayList<String> kq = new ArrayList<String>();
        int num = -1;
        try{ num = Integer.parseInt(a); } catch(Exception ex){}
        if (num == 0) return kq;

        int hang_tram = -1;
        try{ hang_tram = Integer.parseInt(a.substring(0, 1)); } catch(Exception ex){}
        int hang_chuc = -1;
        try{ hang_chuc = Integer.parseInt(a.substring(1, 2)); } catch(Exception ex){}
        int hang_dv = -1;
        try{ hang_dv = Integer.parseInt(a.substring(2, 3)); } catch(Exception ex){}
        //xét hàng trăm
        if (hang_tram != -1){
            kq.add(number[hang_tram]);
            kq.add(TRAM);
        }
        //xét hàng chục
        switch (hang_chuc)
        {
            case -1:
                break;
            case 1:
                kq.add(MUOIF);
                break;
            case 0:
                if (hang_dv != 0) kq.add(LE);
                break;
            default:
                kq.add(number[hang_chuc]);
                kq.add(MUOI);
                break;
        }
        //xét hàng đơn vị
        switch (hang_dv)
        {
            case -1:
                break;
            case 1:
                if ((hang_chuc != 0) && (hang_chuc != 1) && (hang_chuc != -1))
                    kq.add(MOTS);
                else kq.add(number[hang_dv]);
                break;
            case 5:
                if ((hang_chuc != 0) && (hang_chuc != -1))
                    kq.add(LAM);
                else kq.add(number[hang_dv]);
                break;
            case 0:
                if (kq.isEmpty()) kq.add(number[hang_dv]);
                break;
            default:
                kq.add(number[hang_dv]);
                break;
        }
        return kq;
    }
    private static ArrayList<String> Split(String str, int chunkSize)    {
        int du = str.length() % chunkSize;
        //Nếu độ dài chuổi không phải bội số của chunkSize thì thêm # vào trước cho đủ.
        if (du != 0)
            for (int i = 0; i < (chunkSize - du); i++) str = "#" + str;
        return splitStringEvery(str, chunkSize);
    }
    //Hàm cắt chuổi ra thành chuổi nhỏ
    private static ArrayList<String> splitStringEvery(String s, int interval) {
        ArrayList<String> arrList = new ArrayList<String>();
        int arrayLength = (int) Math.ceil(((s.length() / (double) interval)));
        String[] result = new String[arrayLength];
        int j = 0;
        int lastIndex = result.length - 1;
        for (int i = 0; i < lastIndex; i++) {
            result[i] = s.substring(j, j + interval);
            j += interval;
        }
        result[lastIndex] = s.substring(j);
         arrList.addAll(Arrays.asList(result));
        return arrList;
    }
}

Bây giờ ta vào MainActivity để xử lý:

package tranduythanh.com.doctienbangchu;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;

import tranduythanh.com.doctienbangchu.databinding.ActivityMainBinding;
import tranduythanh.com.utils.MoneyConverter;

public class MainActivity extends AppCompatActivity {
    ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding=ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        adEvents();
    }
    private void adEvents() {
        binding.btnDocTien.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String docTien= MoneyConverter.TextOfMoney(binding.editNumberOfMoney.getText().toString());
                binding.txtTextOfMoney.setText(docTien);
            }
        });
    }
}

Chạy lên ta có kết quả:

 

Như vậy Tui đã hướng dẫn xong bài ứng dụng TextView, EditText, Button để làm tiện ích đọc tiền bằng số ra chữ.

Ở bài này Ta ôn tập lại cách thức sử dụng 3 control cơ bản ở trên, sử dụng lại ViewBinding để truy suất tới các biến control trên giao diện cũng như gán sự kiện cho nó

Bạn có thể tải code mẫu ở đây: https://gitlab.com/duythanhcse/DocTienBangChu/

Bài học sau Tui sẽ hướng dẫn các bạn các kỹ thuật xử lý trên CheckBox, RadioButton

Các bạn chú ý theo dõi nhé

Chúc các bạn thành công.

One response

  1. appdev1989gmailcom | Reply

    Lâu lắm rồi em không động vào viết code Android, giờ làm lại thì quên gần hết rồi.
    Cám ơn thầy đã chia sẻ ạ. Em cũng mới note lại những kiến thức học được để khỏi quên https://vntalking.com/tu-hoc-lap-trinh-android-trong-24-gio.html

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.