使用 Seekbar 调整 EditText

Adjust EditText with Seekbar

我有一个 SeekBar,EditText.I 想创建一个 % 滑块,当用户滑动 Seekbar 时,它会调整 EditText 字段。

我试过这个:

    mInterestRateEditText.addTextChangedListener(new TextWatcher() {
  public void afterTextChanged(Editable s) {
    int i = Integer.parseInt(s.toString());
    if (i >= 0 && i <= 100) {
      mInterestRateSeekBar.setProgress(50); 
    }
  }
  public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

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

mInterestRateSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  @Override
  public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    mInterestRateEditText.setText(progress + "");
  }

  @Override
  public void onStartTrackingTouch(SeekBar seekBar) {

  }

  @Override
  public void onStopTrackingTouch(SeekBar seekBar) {

  }
});

但它所做的只是第二次我尝试滑动滑块,它将 EditText 锁定为 0,我无法移动滑块?

正如我在评论中所述,您正在创建一个循环。更改搜索栏,更改文本。这会再次更改搜索栏。

简单的解决方案:使用布尔值。

     boolean changedProgrammatically;

     mInterestRateEditText.addTextChangedListener(new TextWatcher() {
      public void afterTextChanged(Editable s) {
        int i = Integer.parseInt(s.toString());
    if(!changedProgrammatically){
        if (i >= 0 && i <= 100) {
          mInterestRateSeekBar.setProgress(50); 
        }

    }else{
changedProgrammatically = false;
}
      }
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

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

    mInterestRateSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
      @Override
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    changedProgrammatically = true;
        mInterestRateEditText.setText(progress + "");
      }

      @Override
      public void onStartTrackingTouch(SeekBar seekBar) {

      }

      @Override
      public void onStopTrackingTouch(SeekBar seekBar) {

      }
    });