Я получаю данные от сканирования штрих-кода в edittext. На этом Edittext я применил addTextChangedListener с классом Textwatcher. Но он показывает проводное поведение. Он работает нормально в первый раз, но со следующего раза перейдет в рекурсивный цикл. Один элемент, который я сканировал, добавил три раза из-за рекурсивного поведения этого Edittext. Ниже приведен код, который я использую.EditText с TextWatcher показывает проводное поведение и перемещается в рекурсивном цикле
EditText barcodeScanner =(EditText)findViewById(R.id.barcodeFocus);
TextWatcher textwatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
Log.d("@@@@", s.toString());
if (s.length() > 1) {
// TODO Auto-generated method stub
if(flag){
char lastCharacter = s.charAt(s.length() - 1);
if (lastCharacter == 'p') {
String barcode = s.subSequence(0, s.length() - 1).toString();
Log.d("Id before parsing", barcode);
int btnId = Integer.parseInt(barcode.trim());
getItemsInformation(btnId);
}
flag = false;
}
else
flag = true;
}
}
};
barcodeScanner.addTextChangedListener(textwatcher);
private void getItemsInformation(int btnId) {
ProductOptionsDbHandler productOptionDbHandler = new ProductOptionsDbHandler(this);
List<String> optionNames = productOptionDbHandler.getProductOptions(btnId);
Product productdetails = prodDbHand.getSelecteProductsDetails(btnId);
float price = productdetails.getProductPrice();
if(optionNames.size()>0 || price == 0){
Intent intent = new Intent(this,ItemPopUpTabActivity.class);
intent.putExtra("intVariableName", btnId);
intent.putExtra("itemPrice", price);
intent.putExtra("itemTax", productdetails.getTaxRate());
startActivity(intent);
barcodeScanner.removeTextChangedListener(textwatcher);
barcodeScanner.setText("");
barcodeScanner.addTextChangedListener(textwatcher);
}
else{
listofItemList.add(productdetails);
QtyOfItems.add(1);
ItemsPrice.add(price);
ItemsIds.add(productdetails.getProductId());
itemTaxRate.add(productdetails.getTaxRate());
addItemintocheckoutList(price,productdetails);
List<String> itemsOptions = new ArrayList<String>();
itemsOptionsIds.add(itemsOptions);
Variables.itemposition++;
barcodeScanner.removeTextChangedListener(textwatcher);
barcodeScanner.setText("");
barcodeScanner.addTextChangedListener(textwatcher);
}
}
Вход для штрих-кода как 002p. Я пробовал с
barcodeScanner.removeTextChangedListener(textwatcher);
barcodeScanner.setText("");
barcodeScanner.addTextChangedListener(textwatcher);
после выполнения задания в конце, но ничего не изменилось. Я уже пробовал проблему с одним симулятором, поднятую кем-то на SO EditText, OnKeyListener or TextWatcher (barcode scanning) Прошу вас, если я ошибаюсь. Любая помощь приветствуется.
[проверить это] (http://stackoverflow.com/a/20416174/624069) –
@CapDroid почему он перешел в рекурсивный цикл? –
Проблема в том, что строка if (s.length()> 0) всегда будет правдой. Вы должны изменить свой алгоритм, что хотите. – keshav