3

Я получаю данные от сканирования штрих-кода в 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) Прошу вас, если я ошибаюсь. Любая помощь приветствуется.

+0

[проверить это] (http://stackoverflow.com/a/20416174/624069) –

+0

@CapDroid почему он перешел в рекурсивный цикл? –

+0

Проблема в том, что строка if (s.length()> 0) всегда будет правдой. Вы должны изменить свой алгоритм, что хотите. – keshav

ответ

0

Ваша проблема в том, что он подсчитывает каждый символ, который вы вводите отдельно, поэтому, если вы вводите ввод с одной цифрой, он работает хорошо, иначе он принимает каждый символ ввода. У меня такая же проблема и до сих пор не решена.