2010-10-13 3 views
1

Я написал собственный класс предпочтений, который содержит простой индикатор выполнения, позволяющий устанавливать такие вещи, как громкость. Предпочтение отлично поработало, пока я не попробовал поместить два из этих предпочтений на свой экран предпочтений.Пользовательские предпочтения, прыгающие по всему экрану

Когда я сделал это, экран настроек начал действовать странно »два пользовательских предпочтения постоянно меняют места, когда я перетаскиваю строку поиска.

У любого есть идея, почему это происходит? Благодаря

EDIT: здесь код пользовательского предпочтения

import android.content.Context; import 

android.content.SharedPreferences; import android.content.res.TypedArray; import android.graphics.Typeface; import android.preference.Preference; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; 

public class SeekBarPreference extends Preference implements  OnSeekBarChangeListener { 


    private int mMaximum = 60; private int mInterval = 1; private int mMinimum = 1; 

    private int mDefault = 50; private TextView monitorBox; 

    public SeekBarPreference(Context context) {  super(context);  } 

    public SeekBarPreference(Context context, AttributeSet attrs) {  super(context, attrs);  initValues(context, attrs);  } 

    public SeekBarPreference(Context context, AttributeSet attrs, int defStyle)  {  super(context, attrs, defStyle);  initValues(context, attrs);  } 

    private void initValues(Context context, AttributeSet attrs) {  TypedArray styledAttributes = context.obtainStyledAttributes(attrs, 
       R.styleable.SeekBarPreference);   mMinimum = styledAttributes.getInt(
       R.styleable.SeekBarPreference_barMinValue, 1);  mMaximum = styledAttributes.getInt(
       R.styleable.SeekBarPreference_barMaxValue, 1);  mInterval = styledAttributes.getInt(
       R.styleable.SeekBarPreference_barInterval, 1);  mDefault = styledAttributes.getInt(
       R.styleable.SeekBarPreference_defaultValue, mMaximum); } 

    @Override protected View onCreateView(ViewGroup parent) { 

     LinearLayout horizontalLayout = new LinearLayout(getContext());   horizontalLayout.setPadding(15, 5, 10, 5);  horizontalLayout.setOrientation(LinearLayout.HORIZONTAL); 

     LinearLayout verticalLayout = new LinearLayout(getContext());  verticalLayout.setOrientation(LinearLayout.VERTICAL); 

     LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.WRAP_CONTENT, 
       LinearLayout.LayoutParams.WRAP_CONTENT);  layoutParams.gravity = Gravity.LEFT;  layoutParams.weight = 0.5f; 

     LinearLayout.LayoutParams settingTitleLayoutParams = new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.WRAP_CONTENT, 
       LinearLayout.LayoutParams.WRAP_CONTENT);  settingTitleLayoutParams.gravity = Gravity.LEFT;  settingTitleLayoutParams.weight = 
1.0f; 

     LinearLayout.LayoutParams seekbarLayoutParams = new LinearLayout.LayoutParams(
       80, LinearLayout.LayoutParams.WRAP_CONTENT);  seekbarLayoutParams.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL; 

     LinearLayout.LayoutParams selectedAmountLayoutParams = new LinearLayout.LayoutParams(
       30, LinearLayout.LayoutParams.WRAP_CONTENT);  selectedAmountLayoutParams.gravity = Gravity.CENTER; 

     TextView titleTextView = new TextView(getContext());  titleTextView.setText(getTitle());  titleTextView.setTextSize(18);  titleTextView.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD);  titleTextView.setGravity(Gravity.LEFT);   titleTextView.setLayoutParams(settingTitleLayoutParams); 

     TextView summeryTextView = new TextView(getContext());  summeryTextView.setText(getSummary());  summeryTextView.setTextSize(14);  summeryTextView.setTypeface(Typeface.SANS_SERIF);  summeryTextView.setGravity(Gravity.LEFT);  summeryTextView.setLayoutParams(settingTitleLayoutParams); 

     SeekBar bar = new SeekBar(getContext());  bar.setMax(mMaximum);   bar.setProgress(mDefault);  bar.setPadding(10, 0, 10, 0);  bar.setLayoutParams(seekbarLayoutParams);  bar.setOnSeekBarChangeListener(this); 

     this.monitorBox = new TextView(getContext());  this.monitorBox.setTextSize(12);  this.monitorBox.setTypeface(Typeface.MONOSPACE, Typeface.ITALIC);  this.monitorBox.setLayoutParams(selectedAmountLayoutParams);  this.monitorBox.setPadding(2, 5, 0, 0);   this.monitorBox.setText(bar.getProgress() 
+ ""); 

     verticalLayout.addView(titleTextView);  verticalLayout.addView(summeryTextView);  horizontalLayout.addView(verticalLayout, layoutParams);   horizontalLayout.addView(bar);  horizontalLayout.addView(this.monitorBox);  horizontalLayout.setId(android.R.id.widget_frame); 

     return horizontalLayout; } 

    public void onProgressChanged(SeekBar seekBar, int progress,   boolean fromUser) { 

     progress = Math.round(((float) progress)/mInterval) * mInterval;  if (progress < mMinimum)  {   progress = mMinimum;  } 

     if (!callChangeListener(progress))  {   seekBar.setProgress((int) this.mDefault);   return;   } 

     seekBar.setProgress(progress);  this.mDefault = progress;  this.monitorBox.setText(progress + "");   updatePreference(progress); 

     notifyChanged(); } 

    public void onStartTrackingTouch(SeekBar seekBar) { } 

    public void onStopTrackingTouch(SeekBar seekBar) { } 

    @Override protected Object onGetDefaultValue(TypedArray ta, int index) { 

     int dValue = (int) ta.getInt(index, 5); 

     return validateValue(dValue); } 

    @Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue)  {  int temp = restoreValue ? getPersistedInt(5) : (Integer) defaultValue; 

     if (!restoreValue)   persistInt(temp); 

     this.mDefault = temp; } 

    private int validateValue(int value) { 

     if (value > mMaximum)   value = mMaximum;  else if (value < 0)    value = 0;  else if (value % mInterval != 0)   value = Math.round(((float) value)/mInterval) * mInterval; 

     return value; } 

    private void updatePreference(int newValue)  { 

     SharedPreferences.Editor editor = getEditor();  editor.putInt(getKey(), newValue);  editor.commit(); } 

} 

EDIT: Я обнаружил, что создание второго класса с excat же кодом, но другим именем, используя один из каждого решает проблему = наихудшая душа. Я не хочу это делать. у кого есть идея?

+0

Отправьте код! – Nate

+0

Отправленный файл здесь для упрощения redabilty: http://jump.fm/EUNTP – Jason

ответ

2

Не настоящее решение, но определение вашего макета как xml приведет к лучшей и быстрой программе. Вы можете решить свою проблему по пути. Само собой разумеется, что если ваш взлом что-то вместе, это не так, чтобы сделать это программно. Это говорит ...


Вы можете попробовать принимать элементы, которые текут слева направо и размещение их в линейном представлении и установить его по горизонтали, то укладка этих элементов в вертикальное линейное представление. Кажется, что плавающие взгляды бок о бок заставляют телефон заставлять бары прыгать назад и вперед. Классическая проблема css (я меняю поплавок и гравитацию)

Я думаю, что то, что происходит, это когда вы обновляете строку поиска телефон обновляет представление и подходит к различным вычислениям для позиций плавающих просмотров. Если вы выкладываете все, используя вертикальные и горизонтальные линейные виды, это должно решить проблему и сделать ваши макеты намного проще.

+0

Спасибо, я попробую это утром, я измучен. – Jason

0

Я предполагаю, что это встроенное предпочтение, такое как CheckboxPreference, а не DialogPreference, как EditTextPreference.

Если да, взгляните на свой код и убедитесь, что вы каким-то образом не делитесь вещами между несколькими экземплярами того же предпочтения. Я только сделал DialogPreferences, поэтому я не совсем уверен, как настроено встроенное предпочтение. Но если, скажем, вы звоните findViewById() о своей деятельности или что-то, чтобы получить ваш SeekBar, я могу увидеть, где ваши две настройки могут случайно переплетаться. Или, если вы используете изменяемые статические элементы данных, я вижу потенциальные проблемы там.

Помимо этого, как предложил г-н Бросс, вам трудно советовать, не видя кода.

+0

Спасибо, проверите его, когда я вернусь домой. также опубликует код, если это поможет. – Jason

+0

Хорошо, я не мог найти ничего подобного, как вы упомянули - размещенный код, возможно, это поможет. – Jason

+0

@ Джейсон: Извините, ничто не выпрыгивает на меня как источник вашей трудности. – CommonsWare

Смежные вопросы