1. Are you ready for the Galaxy S20? Here is everything we know so far!

Help with SeekBarPreference screen

Discussion in 'Android Development' started by iriondo87, Jul 8, 2013.

  1. iriondo87

    iriondo87 Lurker
    Thread Starter

    Hi guys,

    I'm developing an app that via bluetooth controls few parameters of an external hardware.

    To set this parameters, I've created a custom preference screen. When entering to the preference screen, 3 parameters are displayed, and to control these, I use a dialog preference that displays a seekbar, to select a value in a range from 0 to 100.

    The problem is that, If I only use this custom preference screen with 1 parameter, it works fine, but when I enable the 3 parameters in the custom preference screen, the app crashes.

    The code is the following:


    Preferences.java

    [HIGH]
    public class Preferencias extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferencias);

    }

    }[/HIGH]



    SeekBarDialogPreference.java

    [HIGH]public class SeekBarDialogPreference extends DialogPreference
    {
    private static final int DEFAULT_MIN_PROGRESS = 0;
    private static final int DEFAULT_MAX_PROGRESS = 100;
    private static final int DEFAULT_PROGRESS = 0;

    private int mMinProgress;
    private int mMaxProgress;
    private int mProgress;
    private CharSequence mProgressTextSuffix;
    private TextView mProgressText;
    private SeekBar mSeekBar;

    public SeekBarDialogPreference(Context context)
    {
    this(context, null);
    }

    public SeekBarDialogPreference(Context context, AttributeSet attrs)
    {
    super(context, attrs);

    // get attributes specified in XML
    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SeekBarDialogPreference, 0, 0);
    try
    {
    setMinProgress(a.getInteger(R.styleable.SeekBarDialogPreference_min, DEFAULT_MIN_PROGRESS));
    setMaxProgress(a.getInteger(R.styleable.SeekBarDialogPreference_android_max, DEFAULT_MAX_PROGRESS));
    setProgressTextSuffix(a.getString(R.styleable.SeekBarDialogPreference_progressTextSuffix));
    }
    finally
    {
    a.recycle();
    }

    // set layout
    setDialogLayoutResource(R.layout.preference_seek_bar_dialog);
    setPositiveButtonText(android.R.string.ok);
    setNegativeButtonText(android.R.string.cancel);
    setDialogIcon(null);
    }

    @Override
    protected void onSetInitialValue(boolean restore, Object defaultValue)
    {
    setProgress(restore ? getPersistedInt(DEFAULT_PROGRESS) : (Integer) defaultValue);
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index)
    {
    return a.getInt(index, DEFAULT_PROGRESS);
    }

    @Override
    protected void onBindDialogView(View view)
    {
    super.onBindDialogView(view);

    TextView dialogMessageText = (TextView) view.findViewById(R.id.text_dialog_message);
    dialogMessageText.setText(getDialogMessage());

    mProgressText = (TextView) view.findViewById(R.id.text_progress);

    mSeekBar = (SeekBar) view.findViewById(R.id.seek_bar);
    mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
    {
    @Override
    public void onStopTrackingTouch(SeekBar seekBar)
    {
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar)
    {
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
    {
    // update text that displays the current SeekBar progress value
    // note: this does not persist the progress value. that is only ever done in setProgress()
    String progressStr = String.valueOf(progress + mMinProgress);
    mProgressText.setText(mProgressTextSuffix == null ? progressStr : progressStr.concat(mProgressTextSuffix.toString()));
    }
    });
    mSeekBar.setMax(mMaxProgress - mMinProgress);
    mSeekBar.setProgress(mProgress - mMinProgress);
    }

    public int getMinProgress()
    {
    return mMinProgress;
    }

    public void setMinProgress(int minProgress)
    {
    mMinProgress = minProgress;
    setProgress(Math.max(mProgress, mMinProgress));
    }

    public int getMaxProgress()
    {
    return mMaxProgress;
    }

    public void setMaxProgress(int maxProgress)
    {
    mMaxProgress = maxProgress;
    setProgress(Math.min(mProgress, mMaxProgress));
    }

    public int getProgress()
    {
    return mProgress;
    }

    public void setProgress(int progress)
    {
    progress = Math.max(Math.min(progress, mMaxProgress), mMinProgress);

    if (progress != mProgress)
    {
    mProgress = progress;
    persistInt(progress);
    notifyChanged();
    }
    }

    public CharSequence getProgressTextSuffix()
    {
    return mProgressTextSuffix;
    }

    public void setProgressTextSuffix(CharSequence progressTextSuffix)
    {
    mProgressTextSuffix = progressTextSuffix;
    }

    @Override
    protected void onDialogClosed(boolean positiveResult)
    {
    super.onDialogClosed(positiveResult);

    // when the user selects "OK", persist the new value
    if (positiveResult)
    {
    int seekBarProgress = mSeekBar.getProgress() + mMinProgress;
    if (callChangeListener(seekBarProgress))
    {
    setProgress(seekBarProgress);
    }
    }
    }

    @Override
    protected Parcelable onSaveInstanceState()
    {
    // save the instance state so that it will survive screen orientation changes and other events that may temporarily destroy it
    final Parcelable superState = super.onSaveInstanceState();

    // set the state's value with the class member that holds current setting value
    final SavedState myState = new SavedState(superState);
    myState.minProgress = getMinProgress();
    myState.maxProgress = getMaxProgress();
    myState.progress = getProgress();

    return myState;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state)
    {
    // check whether we saved the state in onSaveInstanceState()
    if (state == null || !state.getClass().equals(SavedState.class))
    {
    // didn't save the state, so call superclass
    super.onRestoreInstanceState(state);
    return;
    }

    // restore the state
    SavedState myState = (SavedState) state;
    setMinProgress(myState.minProgress);
    setMaxProgress(myState.maxProgress);
    setProgress(myState.progress);

    super.onRestoreInstanceState(myState.getSuperState());
    }

    private static class SavedState extends BaseSavedState
    {
    int minProgress;
    int maxProgress;
    int progress;

    public SavedState(Parcelable superState)
    {
    super(superState);
    }

    public SavedState(Parcel source)
    {
    super(source);

    minProgress = source.readInt();
    maxProgress = source.readInt();
    progress = source.readInt();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags)
    {
    super.writeToParcel(dest, flags);

    dest.writeInt(minProgress);
    dest.writeInt(maxProgress);
    dest.writeInt(progress);
    }

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>()
    {
    @Override
    public SavedState createFromParcel(Parcel in)
    {
    return new SavedState(in);
    }

    @Override
    public SavedState[] newArray(int size)
    {
    return new SavedState[size];
    }
    };
    }
    }[/HIGH]


    preference_seek_bar_dialog.xml

    [HIGH]<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:eek:rientation="vertical" >

    <TextView
    android:id="@+id/text_dialog_message"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dip"
    android:paddingLeft="12dip"
    android:paddingRight="12dip" >
    </TextView>

    <TextView
    android:id="@+id/text_progress"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dip"
    android:gravity="center_horizontal" >
    </TextView>

    <SeekBar
    android:id="@+id/seek_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="6dip"
    android:layout_marginTop="6dip" />

    </LinearLayout>[/HIGH]



    Preferences.xml

    [HIGH]<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="preferencias_principal"
    xmlns:custom="http://schemas.android.com/apk/res-auto" >

    <.....SeekBarDialogPreference
    android:key="fast"
    android:title="@string/listtittle1"
    android:summary="@string/summary1"
    android:defaultValue="40"
    android:dialogMessage="Please select a value:"
    android:max="100"
    custom:progressTextSuffix="%"
    custom:min="0" />

    <.....SeekBarDialogPreference
    android:key="climb"
    android:title="@string/listtittle2"
    android:summary="@string/summary2"
    android:defaultValue="80"
    android:dialogMessage="Please select a value:"
    android:max="100"
    custom:progressTextSuffix="%"
    custom:min="0" />

    <....SeekBarDialogPreference
    android:key="platform"
    android:title="@string/listtittle3"
    android:summary="@string/summary3"
    android:defaultValue="60"
    android:dialogMessage="Please select a value:"
    android:max="100"
    custom:progressTextSuffix="%"
    custom:min="0" />

    </PreferenceScreen>[/HIGH]
     



    1. Download the Forums for Android™ app!


      Download

       
Loading...
Similar Threads - Help SeekBarPreference screen
  1. Frizzallen
    Replies:
    2
    Views:
    208
  2. 1987jjc
    Replies:
    1
    Views:
    288
  3. mahinder
    Replies:
    3
    Views:
    257
  4. jumper_d
    Replies:
    3
    Views:
    279
  5. Nikolai Savulkin
    Replies:
    0
    Views:
    219
  6. samiy
    Replies:
    1
    Views:
    187
  7. gremlinkurst
    Replies:
    8
    Views:
    368
  8. scarol1296
    Replies:
    1
    Views:
    226
  9. Stened91
    Replies:
    3
    Views:
    377
  10. Maximiliano Corbo
    Replies:
    0
    Views:
    273

Share This Page

Loading...