Задать вопрос
bartwell
@bartwell

Кастомный Preference меняет позицию после изменения значения?

В настройках моего приложения используется кастомный Preference - SeekBarPreference. Выглядит это так:

051b0b9082b6.jpg

Проблема заключается в том, что после каждого клика по движку (значение необязательно изменять) Control1 и Control2 меняются местами:

23a378e1e7bc.jpg

Происходит это в эмуляторе 2.1. В эмуляторе с 4.2.2 такая проблема не проявляется. Вопрос: из-за чего такое может происходить и в чем разница в этом плане между 2.1 и 4.2.2?

Вот код Preference:

public class SeekBarPreference extends Preference implements OnSeekBarChangeListener {

	private TextView valueTextView;
	private int currentValue;
	private int max;
	private int min;
	final private String NAMESPACE="http://schemas.android.com/apk/res/ru.bartwell.myapp";
	private int defaultValue;

	public SeekBarPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
		Log.d("SeekBarPreference", "Init");
		max = attrs.getAttributeIntValue(NAMESPACE, "max", 99);
		min = attrs.getAttributeIntValue(NAMESPACE, "min", 0);
		defaultValue = attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android", "defaultValue", min);
		if(defaultValue<min) defaultValue=min;
	}
	
	@Override
	protected View onCreateView(ViewGroup parent) {
		currentValue = getPersistedInt(defaultValue)-min;
		
		RelativeLayout layout = (RelativeLayout) LayoutInflater.from(getContext()).inflate(R.layout.seek_bar_preference_layout, null);

		((TextView) layout.findViewById(R.id.title)).setText(getTitle());
		((TextView) layout.findViewById(R.id.summary)).setText(getSummary());

		SeekBar bar = (SeekBar) layout.findViewById(R.id.seekBar);
		bar.setMax(max-min);
		bar.setProgress(currentValue);
		bar.setOnSeekBarChangeListener(this);

		valueTextView = (TextView) layout.findViewById(R.id.value);
		valueTextView.setText(String.valueOf(currentValue+min));

		return layout;
	}

	public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
		valueTextView.setText(String.valueOf(progress+min));
		valueTextView.invalidate();
	}

	public void onStartTrackingTouch(SeekBar seekBar) {}

	public void onStopTrackingTouch(SeekBar seekBar) {
		currentValue = seekBar.getProgress();
		persistInt(currentValue+min);
		notifyChanged();
	}

}


Используется так (prefs.xml):

<ru.bartwell.myapp.SeekBarPreference
	android:key="Control1"
	android:summary="@string/control1_description"
	android:title="@string/control1"
	android:defaultValue="12"
	sbp:min="1"
	sbp:max="20" />

<ru.bartwell.myapp.SeekBarPreference
	android:key="Control2"
	android:summary="@string/control2_description"
	android:title="@string/control2"
	android:defaultValue="3"
	sbp:min="1"
	sbp:max="15" />


PrefActivity.java:

public class PrefActivity extends PreferenceActivity {

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

}
  • Вопрос задан
  • 2740 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы