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:

[code language=”xml”]
<?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>
[/code]

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:

[code language=”java”]
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;
}
}
[/code]

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

[code language=”java”]
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);
}
});
}
}
[/code]

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 thought on “Bài 14. TextView, EditText, Button trong Android phần 2”

Leave a Reply