2014-11-28 1 views
0

У меня есть небольшая проблема в моем коде:Android Циклические слушатели

У меня есть SeekBar и EditText в макете. Что я хочу сделать, это установить значение EditText, когда SeekBar изменится и установите SeekBar при изменении EditText.

До сих пор, у меня есть следующий код:

SeekBar seek_coagulation = (SeekBar) findViewById(R.id.seek_coagulation); 
    EditText edit_coagulation = (EditText) findViewById(R.id.edit_coagulation); 
    seek_coagulation.incrementProgressBy(1); 
    seek_coagulation.setMax(1000); 
    seek_coagulation.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) 
     { 
      double value = progress/100.0; 
      edit_coagulation.setText(String.valueOf(value)); 
     } 

     public void onStartTrackingTouch(SeekBar seekBar) 
     { 
     } 

     public void onStopTrackingTouch(SeekBar seekBar) 
     { 
     } 
    }); 
    edit_coagulation.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) 
     { 
      double value = (s != null && s.toString().length() > 0) ? Double.parseDouble(s.toString().replace(',', '.')) : 0D; 
      int progress = (int) (value * 100); 
      seek_coagulation.setProgress(progress); 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, int after) 
     { 
     } 

     public void onTextChanged(CharSequence s, int start, int before, int count) 
     { 
     } 
    }); 

Первый случай (SeekBar к EditText) работает хорошо, но не второй. Проблема в том, что это петля (SeekBar - EditText - SeekBar - EditText и т. Д.).

Есть ли способ исправить это?

+0

Я думаю, что вы выбрали какой-то другой подход liek, возьмите одну кнопку, которая установит значение EditText в панель поиска, когда будет нажата кнопка щелчка вместо EditText addTextChangedListener. –

ответ

1

Я предлагаю использовать два логических параметров, чтобы заблокировать изменения, например:

boolean mIsTextLocked = false;  
    boolean mIsSeekBarLocked = false; 

    seek_coagulation = (SeekBar) findViewById(R.id.seek_coagulation); 
    EditText edit_coagulation = (EditText) findViewById(R.id.edit_coagulation); 
    seek_coagulation.incrementProgressBy(1); 
    seek_coagulation.setMax(1000); 
    seek_coagulation.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) 
     { 
      if(!mIsSeekBarLocked){ 
       mIsTextLocked = true; 
       double value = progress/100.0; 
       edit_coagulation.setText(String.valueOf(value)); 
      } 
     } 

     public void onStartTrackingTouch(SeekBar seekBar) 
     { 
     } 

     public void onStopTrackingTouch(SeekBar seekBar) 
     { 
      mIsTextLocked = false; 
     } 
    }); 
    edit_coagulation.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) 
     { 
      if(!mIsTextLocked){ 
      mIsSeekBarLocked = true; 
      double value = (s != null && s.toString().length() > 0) ?Double.parseDouble(s.toString().replace(',', '.')) : 0D; 
      int progress = (int) (value * 100); 
      seek_coagulation.setProgress(progress); 
      mIsSeekBarLocked = false; 
      } 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, int after) 
     { 
     } 

     public void onTextChanged(CharSequence s, int start, int before, int count) 
     { 
     } 
    }); 

Я не проверял, но он должен работать.