Search code examples
androidseekbar

Android SeekBar: Changing the value


I am writing a block of code where I am programmatically creating a SeekBar to capture a percentage. The percentage is then displayed in a TextView. I have written the code to display both on screen:

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());
}

How can I handle the SeekBar change. I want the TextView value to change depending on the thumb position. The maximum percentage is 100% and the minimum is 0%.

I would also like to set an onClickListener on the TextView and update the position of the SeekBar based on the entered value to allow for more accurate values to be entered. The value in my data carrier, called Pebble, is a float as I would like to allow Float numbers.

Any help would be appreciated.

Regards,

Owen


Solution

  • First of all, you should set max progress:

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

    Tracking changes of 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) {
    
        }
    });
    

    And for changing SeekBar progress from EditText, you can add a TextWatcher to your EditText

    Update For the TextWatcher you can use something like this:

    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) {}
    });