Android почему предпочтение автоматически меняет позиции? - PullRequest
3 голосов
/ 09 января 2011

У меня есть файл preferences.xml с некоторыми настройками флажков, пользовательскими настройками выбора времени и пользовательскими настройками SeekBar. Все отлично работает в моем эмуляторе 2.2. Я пытался запустить его в эмуляторе 1.6, и каждый раз, когда я настраиваю один из ползунков (предпочтения SeekBar) или меняю другое предпочтение, предпочтения SeekBar меняют позиции. Как будто они просто перемешиваются. Кто-нибудь знает, как я могу это остановить? Это удерживает меня от группирования, потому что они всегда меняют позиции.

У меня есть это для моей предпочтительной деятельности:

public class MySettings extends PreferenceActivity {    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }   
}

Это для моего слайдера:

public class PreferenceSlider extends Preference implements OnSeekBarChangeListener
{  
    public static int maximum    = 100; 
    public static int interval   = 1;  
    private float oldValue = 50; 
    private TextView monitorBox;   
    private float beforeTouch = 50;

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

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

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

    @Override 
    protected View onCreateView(ViewGroup parent)
    {     
        LinearLayout layout = new LinearLayout(getContext());      
        LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);   
        params1.gravity = Gravity.LEFT;   
        params1.weight  = 1.0f;         
        LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);   
        params2.gravity = Gravity.LEFT;   
        LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(30, LinearLayout.LayoutParams.WRAP_CONTENT);   
        params3.gravity = Gravity.LEFT; 

        layout.setPadding(15, 5, 10, 5);   
        layout.setOrientation(LinearLayout.VERTICAL);      
        TextView view = new TextView(getContext());   
        view.setText(getTitle());   
        view.setTextSize(18);   
        view.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD);   
        view.setGravity(Gravity.LEFT);   
        view.setLayoutParams(params1);       
        SeekBar bar = new SeekBar(getContext());   
        bar.setMax(maximum);   
        bar.setProgress((int)this.oldValue);  
        //bar.
        //bar.setLayoutParams(params2);   
        bar.setOnSeekBarChangeListener(this);      
        this.monitorBox = new TextView(getContext());   
        this.monitorBox.setTextSize(12);   
        this.monitorBox.setTypeface(Typeface.MONOSPACE, Typeface.ITALIC);   
        this.monitorBox.setLayoutParams(params3);   
        this.monitorBox.setPadding(2, 5, 0, 0);   
        this.monitorBox.setText(bar.getProgress()+"");         
        layout.addView(view);   
        layout.addView(bar);   
        layout.addView(this.monitorBox);   
        layout.setId(android.R.id.widget_frame);         
        return layout;  
    }  

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress,boolean fromTouch) 
    {      
        progress = Math.round(((float)progress)/interval)*interval;      
        if(!callChangeListener(progress)){
            seekBar.setProgress((int)this.oldValue);     
            return;     }        
        seekBar.setProgress(progress);    
        this.oldValue = progress;    
        this.monitorBox.setText(progress+"");    
        updatePreference(progress);      
        //notifyChanged(); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) 
    { 
        beforeTouch = seekBar.getProgress();
    }

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) 
    { 
        if(beforeTouch != seekBar.getProgress())
        {
            notifyChanged();
        }
    }  

    @Override  
    protected Object onGetDefaultValue(TypedArray ta,int index)
    {    
        int dValue = (int)ta.getInt(index,50);       
        return validateValue(dValue); 
    }     

    @Override    
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) 
    {          
        int temp = restoreValue ? getPersistedInt(50) : (Integer)defaultValue;
        if(!restoreValue)        
            persistInt(temp);           
        this.oldValue = temp;    
    }      

    private int validateValue(int value)
    {           
        if(value > maximum)     
            value = maximum;    
        else if(value < 0)     
            value = 0;    
        else if(value % interval != 0)     
            value = Math.round(((float)value)/interval)*interval;               
        return value;      
    }         

    private void updatePreference(int newValue)
    {    
        SharedPreferences.Editor editor =  getEditor();  
        editor.putInt(getKey(), newValue);  
        editor.commit(); } 
    }

Тогда preferences.xml выглядит так:

<com.myprogram.PreferenceSlider                  
    android:key="ringerVolume"              
    android:defaultValue="50"                
    android:title="Ringer Volume"/>

<com.myprogram.PreferenceSlider                  
    android:key="notificationVolume"                
    android:defaultValue="50"                
    android:title="Notification Volume"/>

1 Ответ

2 голосов
/ 11 декабря 2013

Вам не стоит беспокоиться об Android 1.6, по крайней мере, это означает, что у вас есть грязь в вашем коде, которая не видна по какой-либо причине в 2.2, но может быть в некоторых других версиях, даже более новых.

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

Как вы можете видеть здесь addPreferencesFromResource устарела, поскольку APIуровень 11 , это означает, что 75% устройств смотрят на это как на некоторые старые вещи, а некоторые новейшие устройства могут однажды даже вызвать ошибку в некой «я вам сказал» основе.

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

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

Для начала вы можете прочитать код здесь:

Android Developer - Reference - PreferenceFragment

Или прочитайте полное руководство здесь:

Android Developer - Api Guides - UI - Настройки

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...