• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Help with SeekBarPreference screen

iriondo87

Lurker
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:orientation="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]
 
Back
Top Bottom