TextWatcher pada aplikasi Catatan Kredit

Pada awal aplikasi dibuat, saya mengalami kesulitan menghadapi persoalan titik/koma pada ribuan. Karena setiap hape masing masing memiliki setelan English atau Indonesia atau lainnya, menyebabkan apa yang nampak dilayar akan diterjemahkan berbeda saat masuk dalam data. Untuk menghindari itu, maka saya terapkan text watcher yang tidak mengijinkan user menulis titik/koma. Akan tetapi textwatcher akan membuatkan spasi antar ribuan sehingga user dapat langsung melihat jumlah nol. Saya lihat mBCA juga tidak mengijinkan titik/koma, jadi bisa salah jumlah nol, walaupun mBCA kemudian menuliskan nilai rupiah dalam titik ribuan sebelum melanjutkan ke pin.

Inilah textwatcher yang saya terapkan diawal aplikasi ini meluncur.

public class ThousandSeparatorTextWatcher implements TextWatcher {
private DecimalFormat df;
private EditText editText;
private static String thousandSeparator;
private static String decimalMarker;
private int cursorPosition;
public ThousandSeparatorTextWatcher(EditText editText) {
this.editText = editText;
df = new DecimalFormat("#,###.##");
df.setDecimalSeparatorAlwaysShown(true);
thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
}

@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
}

@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

@Override
public void afterTextChanged(Editable s) {
try {
editText.removeTextChangedListener(this);
String value = editText.getText().toString();
if (value != null && !value.equals("")) {
if (value.startsWith(decimalMarker)) {
String text = "0" + decimalMarker;
editText.setText(text);
}
if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
int index = 0;
while (index < value.length() && value.charAt(index) == '0') {
index++;
}
String newValue = Character.toString(value.charAt(0));
if (index != 0) {
newValue = value.charAt(0) + value.substring(index);
}
editText.setText(newValue);
}
String str = editText.getText().toString().replaceAll(thousandSeparator, "");
if (!value.equals("")) {
editText.setText(getDecimalFormattedString(str));
}
editText.setSelection(editText.getText().toString().length());
}
//setting the cursor back to where it was
editText.setSelection(editText.getText().toString().length() - cursorPosition);
editText.addTextChangedListener(this);
} catch (Exception ex) {
ex.printStackTrace();
editText.addTextChangedListener(this);
}
}

private static String getDecimalFormattedString(String value) {
String[] splitValue = value.split("\\.");
String beforeDecimal = value;
String afterDecimal = null;
String finalResult = "";
if (splitValue.length == 2) {
beforeDecimal = splitValue[0];
afterDecimal = splitValue[1];
}
int count = 0;
for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
finalResult = beforeDecimal.charAt(i) + finalResult;
count++;
if (count == 3 && i > 0) {
finalResult = thousandSeparator + finalResult;
count = 0;
}
}
if (afterDecimal != null) {
finalResult = finalResult + decimalMarker + afterDecimal;
}
return finalResult;
}
}

Class diatas dipakai oleh nominal input dibawah ini

editText.addTextChangedListener(new ThousandSeparatorTextWatcher(editText));

Kemudian saat saya sudah banyak waktu pada masa pandemi corona ini, saya merubah teknik itu. Setelah mengatasi masalah rupiah tidak nol, saya matikan textwatcher dan saya ijinkan menulis titik/koma atau tidak sama sekali. Terserah kemauan user. Pada saat nominal itu mau masuk ke sistem database, maka titik/koma dihapuskan oleh aplikasi secara dibelakang layar seperti dibawah ini.

(Integer.parseInt(mBinding.restaurantFormRating.getText().toString().replaceAll("[,|.]", ""))) * -1,

Saat ujicoba di hape saya, tiba tiba nampak kalau saya salah mengisi titik/koma dengan nilai SEN. Dan menjadikan data terisi tambahan 2 buah nol. Hal ini tidak memungkinkan saya untuk menyuruh user tidak membuat SEN. Jadi harus aplikasi yang pintar tuk mengurus ini. Maka saya terapkan uji nominal tuk nilai SEN sebelum menjadi data di Cloud. Bila menjumpai nilai SEN maka aplikasi akan membuang transaksi tersebut walaupun user menekan tombol SIMPAN. Hehehe, tidak terjadi suatu apapun. Dan user pasti sadar bahwa telah mengisi nilai SEN pada nominal sehingga tidak ada transaksi apapun. Begini saya membuat aplikasi.

if (mBinding.restaurantFormRating.length() < 3) {
if (!mBinding.restaurantFormRating.getText().toString().matches("")) {
Rating rating = new Rating(
calDarurat.getTime(), calJtpRating.getTime(),
(Integer.parseInt(mBinding.restaurantFormRating.getText().toString().replaceAll("[,|.]", ""))) * -1,
mBinding.restaurantFormText.getText().toString());
if (mRatingListener != null) {
mRatingListener.onRating(rating);
}
}
} else if (!(mBinding.restaurantFormRating.getText().toString().substring(mBinding.restaurantFormRating.length() - 3, mBinding.restaurantFormRating.length() - 2)).matches("[,|.]")) {
if (!mBinding.restaurantFormRating.getText().toString().matches("")) {
Rating rating = new Rating(
calDarurat.getTime(), calJtpRating.getTime(),
(Integer.parseInt(mBinding.restaurantFormRating.getText().toString().replaceAll("[,|.]", ""))) * -1,
mBinding.restaurantFormText.getText().toString());
if (mRatingListener != null) {
mRatingListener.onRating(rating);
}
}
}

 Jadi if yang atas tuk mencegah nilai puluhan rupiah dibuang oleh aplikasi karena adanya pemeriksaan else if untuk 3 karakter terakhir. Bila saya lupa terapkan if yang nilai puluhan itu, maka bila user isi nominal dengan hanya sejumlah Rp.25 contohnya, sistem akan membuangnya. Hal ini tidak boleh terjadi. Yang dibuang adalah nilai sen yaitu spt ini Rp.555.555,25 yang akan dibuang oleh aplikasi.

Semoga paham yaa. Jadi didalam membuat aplikasi, saya mencoba segala kemungkinan user melakukan pengisiannya. Tetapi juga memudahkan user mengisi nominal. Saya dapat membayangkan kesulitan user melihat angka 0 yang rapat berderet sebanyak lima buah, eh atau 6 yaa. 

Jadi dengan memberikan ijin user menulis menggunakan titik atau koma atau spasi di nominal, maka user akan senang dan bisa memeriksa jumlah nol dengan baik Dan menurut pemikiran saya, metode ini lebih baik dari textwatcher. Karena textwatcher seperti membebani aplikasi dan memperlambat user experience. Karena setiap user mengetikkan angka, layar bergerak gerak dan hal ini menghentikan user untuk melanjutkan input berikutnya. Dengan melepaskan textwatcher, user akan terbebas dari gerakan angka di layar. Metode sederhana dan menyenangkan bagi user dan aplikasi juga.

Terimakasih sudah membaca.

Kupas tuntas aplikasi Catatan Kredit

Lanjutan kupas tuntas aplikasi Catatan Kredit

Komentar