2015-03-19 3 views
1

Итак, я пытаюсь сохранить значения SeekBar onPause, а затем снова включить их. Мой код работает, но по какой-то причине сохраняется только первый в списке. Если я сменил reds SeekBar, то это спасет, но ничего больше, если я останусь красным на 0 и перейду зеленым до 40, тогда этот зеленый будет сэкономить, но если я поменяю красный, останется только красный. Я не знаю, почему это происходит. Я должен использовать onResume или onPause, иначе я ставил бы свои переменные.onPause и onResume метод с использованием sharedPreferences

import android.content.SharedPreferences; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.SeekBar; 
import android.widget.TextView; 
import android.widget.SeekBar.OnSeekBarChangeListener; 
import android.graphics.Color; 



public class ColorChooserActivity extends ActionBarActivity 
implements OnSeekBarChangeListener { 

    // define variables for the widgets 
    private SeekBar redSeekBar; 
    private SeekBar greenSeekBar; 
    private SeekBar blueSeekBar; 
    private SeekBar alphaSeekBar; 
    private View colorView; 
    private TextView colorTextView; 

    //instance variable 
    private int colorValue = 0; 
    private int redValue = 0; 
    private int greenValue = 0; 
    private int blueValue = 0; 
    private int alphaValue = 0; 
    private String output; 

    // define the SharedPreferences object 
    private SharedPreferences savedValues; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_color_chooser); 

     // get references to the widgets 
     redSeekBar = (SeekBar) findViewById(R.id.redSeekBar); 
     greenSeekBar = (SeekBar) findViewById(R.id.greenSeekBar); 
     blueSeekBar = (SeekBar) findViewById(R.id.blueSeekBar); 
     alphaSeekBar = (SeekBar) findViewById(R.id.alphaSeekBar); 
     colorView = (View) findViewById(R.id.colorView); 
     colorTextView = (TextView) findViewById(R.id.colorTextView); 

     // add listeners 
     redSeekBar.setOnSeekBarChangeListener(this); 
     greenSeekBar.setOnSeekBarChangeListener(this); 
     blueSeekBar.setOnSeekBarChangeListener(this); 
     alphaSeekBar.setOnSeekBarChangeListener(this); 

     // get SharedPreferences object 
     savedValues = getSharedPreferences("SavedValues", MODE_PRIVATE); 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_color_chooser, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onPause() { 
     // save the instance variables 
     SharedPreferences.Editor editor = savedValues.edit(); 
     editor.putInt("redValue", redValue); 
     editor.putInt("greenValue", greenValue); 
     editor.putInt("blueValue", blueValue); 
     editor.putInt("alphaValue", alphaValue); 
     editor.putInt("colorValue", colorValue); 
     editor.putString("output", output); 
     editor.commit(); 

     super.onPause(); 
    } 

    @Override 
    public void onResume() { 

     //get the instance variables 
     redValue = savedValues.getInt("redValue", redValue); 
     greenValue = savedValues.getInt("greenValue", greenValue); 
     blueValue = savedValues.getInt("blueValue", blueValue); 
     alphaValue = savedValues.getInt("alphaValue", alphaValue); 
     colorValue = savedValues.getInt("colorValue", colorValue); 
     output = savedValues.getString("output", output); 



     // set widgets 
     colorView.setBackgroundColor(colorValue); 
     colorTextView.setText(output); 
     redSeekBar.setProgress(redValue); 
     greenSeekBar.setProgress(greenValue); 
     blueSeekBar.setProgress(blueValue); 
     alphaSeekBar.setProgress(alphaValue); 

     super.onResume(); 

    } 

    // argb method 
    public int argb(int a, int r, int g, int b){ 
     return Color.argb(a, r, g, b); 
    } 

    //***************************************************** 
    // Event handler for the SeekBar 
    //***************************************************** 
    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) 
    { 
     redValue = redSeekBar.getProgress(); 
     greenValue = greenSeekBar.getProgress(); 
     blueValue = blueSeekBar.getProgress(); 
     alphaValue = alphaSeekBar.getProgress(); 

     colorValue = argb(alphaValue, redValue, greenValue, blueValue); 

     colorView.setBackgroundColor(colorValue); 

     output = "Red: " + redValue + " Green: " + greenValue + 
       " Blue: " + blueValue + " Alpha: " + alphaValue; 

     colorTextView.setText(output); 
    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar){ 
    } 


} 
+0

Вы должны использовать метод onSaveInstanceState() и onRestoreInstanceState() для сохранения состояний и восстановления состояний активности. –

ответ

1

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

В принципе, вы должны иметь что-то подобное в вашем onCreate метод (на основе комментариев не давал SO пользователя на ваш вопрос):

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


    switch (seekBar.getId()) { 
    case R.id.redSeekBar: 
     redValue = redSeekBar.getProgress(); 
     break; 
    case R.id.greenSeekBar: 
     greenValue = greenSeekBar.getProgress(); 
     break; 
    case R.id.blueSeekBar: 
     blueValue = blueSeekBar.getProgress(); 
     break; 
    case R.id.alphaSeekBar: 
     alphaValue = alphaSeekBar.getProgress(); 
     break; 
    } 

    colorValue = argb(alphaValue, redValue, greenValue, blueValue); 

    colorView.setBackgroundColor(colorValue); 

    output = "Red: " + redValue + " Green: " + greenValue + " Blue: " 
      + blueValue + " Alpha: " + alphaValue; 

    colorTextView.setText(output); 
} 

Я надеюсь, что это помогает.

+0

Слушатель не является проблемой, он связан с объектом sharedPreference, не сохраняющим более одного из значений int. Его странно, потому что сохраняется сохранение значения colorValue и опции String. Если я сделаю все свои переменные статичными и удалю методы onResume и onPause, то программа работает безупречно. Его как объект sharedPreference не будет содержать больше одного int ... – EsotericRider

+0

Я только что протестировал этот код, и я могу получить сохраненные значения поисковой строки после закрытия приложения и снова открыть его. Код, который вы отправили, сохраняет только «последнее измененное» значение значка поиска, когда приложение закрыто и открыто снова. – iRuth

+0

Я, наконец, вижу, что вы там делали, первый черновик, который вы сделали, был путаным. Это отлично поработало, спасибо! – EsotericRider

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