Android SeekBar:更改值

Android SeekBar: Changing the value

我正在编写一段代码,我在其中以编程方式创建一个 SeekBar 来捕获百分比。然后百分比显示在 TextView 中。我已经编写了在屏幕上显示两者的代码:

public static void pebbleTypeHandler(LinearLayout layout, final TaskSwitcherTask task, PData value)
{
    // Create an android seek bar to allow thumb drag
    // Have a text view to display the value
    Log.v(PebbleTypeHandlerPercentage.class.toString(), "-----> Percentage");

    SeekBar seekbar = new SeekBar(task.getParent());
    TextView textView = new TextView(task.getParent());
    textView.setTextColor(ColorStateList.valueOf(0xFFFFFFFF));
    textView.setText(((PPercentage) value).getValue() + "%");

    layout.addView(textView);
    layout.addView(seekbar);

    int id = UtilityMethods.getNextId();
    value.getMeta().getDataPebble().setId(id);
    textView.setId(id);
    id = UtilityMethods.getNextId();
    seekbar.setId(id);

    Log.v(PebbleTypeHandlerLevel.class.toString(), "-----> TextView ID: " + textView.getId());
    Log.v(PebbleTypeHandlerLevel.class.toString(), "-----> SeekBar ID: " + seekbar.getId());
}

我该如何处理 SeekBar 的变化。我希望 TextView 值根据拇指位置而变化。最大百分比为 100%,最小百分比为 0%。

我还想在 TextView 上设置一个 onClickListener 并根据输入的值更新 SeekBar 的位置,以便输入更准确的值。我的数据载体中的值称为 Pebble,是一个浮点数,因为我希望允许 Float 个数字。

如有任何帮助,我们将不胜感激。

此致,

欧文

首先,您应该设置最大进度:

strokeWidthBar.setMax(<your max progress>);
strokeWidthBar.setProgress(0); // Set initial progress value

跟踪SeekBar的变化

seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
        textView.setText(String.valueOf(progress));
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

要从 EditText 更改 SeekBar 进度,您可以将 TextWatcher 添加到您的 EditText

更新 对于 TextWatcher 你可以使用这样的东西:

editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // Convert text to integer. Do you already use editText.setInputType(InputType.TYPE_CLASS_NUMBER), don't you?
        Integer enteredProgress = Integer.valueOf(s.toString());
        seekBar.setProgress(enteredProgress);
    }

    @Override
    public void afterTextChanged(Editable s) {}
});

您将需要使用 SeekBar 对象和 EditText 而不是 TextView,因为 eidttext 用于获取用户输入。 然后,您必须在 EditText 上的 seekBar 和 TextWatcher 上添加 seekbarChangeListener。我举下面的例子。

    yourEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //You can set value to seekbar here. obviously after checking if its valid and converting it into int/float.

              yourseekBar.setvalue(Integer.valueOf(s));
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

并添加 seekbarchanged 监听器。

yourseekbar.setOnSeekBarChangeListener(new  SeekBar.OnSeekBarChangeListener() {

 @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
      //convert progress into float if you want but it should be multiple of 10        

    yourEdittext.setText(progress+"");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}

});

由于 seekbar 只接受 int 值,因此您必须先将浮点值转换为整数。