2010-10-13 6 views
1

J'ai écrit une classe de préférence personnalisée qui contient une barre de progression simple pour permettre de régler des choses comme le volume. La préférence a fonctionné très bien jusqu'à ce que j'ai essayé de mettre deux de ces préférences dans mon écran de préférence. Lorsque je l'ai fait, l'écran des préférences a commencé à agir de façon irrégulière »les deux préférences personnalisées changent constamment d'emplacement lorsque je fais glisser la barre de recherche.Préférence personnalisée sautant sur l'écran

Quelqu'un a-t-il une idée de ce qui se passe? Merci

EDIT: voici le code de la préférence personnalisée

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: J'ai trouvé que la création d'une deuxième classe avec le excat même code, mais un nom différent un en utilisant un de chaque résout le problème = pire soulution jamais. Je ne veux pas faire ça. Quelqu'un a quelquonque idée?

+0

Postez le code !! – Nate

+0

Fichier posté ici pour une plus grande facilité de lecture: http://jump.fm/EUNTP – Jason

Répondre

2

Pas une vraie solution mais la définition de votre mise en page en tant que xml conduira à un programme meilleur et plus rapide. Vous pourriez résoudre votre problème en cours de route. Inutile de dire que si votre piratage quelque chose ensemble n'est pas mauvais de le faire de manière programmatique. Cela dit ...


Vous pouvez essayer de prendre les éléments que l'écoulement de gauche à droite et de les placer dans une vue linéaire et la mise à l'horizontale puis empiler ces éléments dans une vue linéaire verticale. Il semble que flotter les vues côte à côte amène le téléphone à faire sauter les barres d'un côté à l'autre.Un problème css classique (je suis en train de changer flottant et gravité)

Je pense que ce qui se passe est quand vous mettez à jour la barre de recherche le téléphone met à jour la vue et arrive à différents calculs pour les positions des vues flottantes. Si vous disposez tout en utilisant des vues linéaires verticales et horizontales, cela devrait vous aider à résoudre votre problème et à rendre vos mises en page beaucoup plus simples.

+0

Merci, je vais essayer dans la matinée, je suis épuisé. – Jason

0

Je devine qu'il s'agit d'une préférence en ligne, comme un CheckboxPreference, au lieu d'un DialogPreference comme un EditTextPreference.

Si c'est le cas, jetez un oeil à votre code et assurez-vous de ne pas partager des choses par inadvertance entre plusieurs instances de la même préférence. J'ai seulement fait DialogPreferences, donc je ne suis pas tout à fait sûr comment une préférence en ligne est mis en place. Mais si, par exemple, vous appelez findViewById() sur l'activité ou quelque chose pour obtenir votre SeekBar, je peux voir où vos deux préférences pourraient accidentellement devenir entrelacées. Ou, si vous utilisez des membres de données statiques mutables, je pourrais y voir des problèmes potentiels. Au-delà de cela, comme l'a suggéré M. Bross, il est difficile de vous donner des conseils sans voir le code.

+0

Merci de vérifier quand je serai de retour à la maison. affichera le code aussi si cela peut aider. – Jason

+0

Ok, je n'ai pas pu trouver quelque chose comme vous avez mentionné - le code posté peut-être cela aidera. – Jason

+0

@Jason: Désolé, rien ne me semble être la source de votre difficulté. – CommonsWare

Questions connexes