Shared preference al primo avvio

di il
23 risposte

Shared preference al primo avvio

Ho u problem con l'avvio dell'applicazione con le shared preference presenti, ho la seguente classe:
public class MainActivity extends Activity
{

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	@Override
	protected void onResume()
	{
		super.onResume();
		mostraToastPrimoAvvio();
	}

	private final static String ANNO = "anno";
	private void mostraToastPrimoAvvio()
	{
		SharedPreferences prefs = getPreferences(MODE_PRIVATE);
		if (prefs.getBoolean(ANNO, true));
		{
			
			Toast.makeText(this, R.string.primo_avvio, Toast.LENGTH_LONG).show();
			Editor prefsEditor = prefs.edit();
			prefsEditor.putBoolean(ANNO, false);
			prefsEditor.commit();
			Intent addintent = new Intent(MainActivity.this,Set_anno.class);
			startActivity(addintent);
		}
	}
}
che dovrebbe verificare se ci sono le shared e in caso non ci siamo avviarmi la classe Set_anno.
La cosa sembra funzionare, almeno, dopo un wipe dell'emulatore avvio l'app e mi si avvia la classe Set_anno come previsto.Se invece le shared sono presenti, vorrei che si avviasse la classe DBMain, come posso fare per fare uno start DBMain se le shared sono inserite??

23 Risposte

  • Re: Shared preference al primo avvio

    Al primo avvio ovviamente questo valore non sarà memorizzato, quindi la "getBoolean" fallirà e restituirà il valore specificato come secondo parametro.
    Secondo me la soluzione più semplice consiste nel salvare il valore "true" nel momento in cui viene lanciata la prima volta l'app e poi effettuare il controllo su questo valore: se è presente allora ci sarà salvato "true" altrimenti è necessario restituire un altro valore (e coi boolean non resta che "false")


    Sent from my iPhone using Tapatalk
  • Re: Shared preference al primo avvio

    E se per complicarmi meno la vita mettessi un controllo del tipo
    if (anno != null) {
    			editor.putString(ANNO, anno.toString());
    			editor.commit();
    in che modo posso fare lo star dell'activity?
    a dir la verità ci avevo provato, ma non sono riuscito ugualmente nel mio intento
  • Re: Shared preference al primo avvio

    Farlo con un boolean o con una stringa è la stessa cosa..sicuramente un boolean è più immediato da verificare:
    
    if (editor.getBoolean(ANNO, false)) {
       ....
    } else {
       editor.putBoolean(ANNO, true);
       ....
    }
    

    Sent from my iPhone using Tapatalk
  • Re: Shared preference al primo avvio

    Ma non c'e' modo di pre-impostare il valore anno in modo che al primo avvio me lo ritrovo e lo cambio solo all'occorrenza??
  • Re: Shared preference al primo avvio

    Si, si può fare. Se il tuo scopo è questo puoi usare un intero o una stringa appunto..ad esempio puoi prendere l'anno corrente dalla data di avvio dell'app!


    Sent from my iPhone using Tapatalk
  • Re: Shared preference al primo avvio

    Riferendomi alla app dei turni a cui mi avevi dato un aiuto, adesso ho il famoso select che mi permette di cambiare anno, chiaramente vorrei partire preimpostandolo 2014 e gli anni futuri,
    adesso funziona perfettamente, ma trovo scomodo appena apro l'app andare ad impostare l'anno. Se in qualche modo posso preinpostarlo non sarebbe male, chiaramente avendo la possibilita tramite apposita activity di cambiarlo.
  • Re: Shared preference al primo avvio

    Si può fare anche direttamente nel momento in cui crei il selector! Basta che setti l'anno come selezionato!


    Sent from my iPhone using Tapatalk
  • Re: Shared preference al primo avvio

    Mi fa piacere il mio problema e che non so come farlo
  • Re: Shared preference al primo avvio

    Immagino che come componente grafico tu abbia usato uno spinner o qualcosa del genere.
    Guardando esiste il metodo "setSelection", il quale
    Sets the currently selected item
    sulla base di un parametro indicante la posizione dell'elemento da selezionare.
    Ad esempio se hai uno spinner con i seguenti dati:
    2014
    2015
    2016
    ....

    devi fare:
    
    spinner.setSelection(0);
    
  • Re: Shared preference al primo avvio

    Attualmente imposto le shared attraverso una semplice edittext in questo modo:
    public class Set_anno extends Activity {
    	private final static String MY_PREFERENCES = "MyPref";
    	private final static String ANNO = "anno";
    
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.set_anno);
    		updatePreferencesData();
    	}
    
    	
    	public void savePreferencesData(View view) {
    		SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
    		SharedPreferences.Editor editor = prefs.edit();
    		EditText outputAnno = (EditText) findViewById(R.id.inputanno);
    		CharSequence anno = outputAnno.getText();
    		if (anno != null) {
    			editor.putString(ANNO, anno.toString());
    			editor.commit();
    		}
    		updatePreferencesData();
    	}
    	
    	private void updatePreferencesData(){
    		SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
    		String anno = prefs.getString(ANNO, "Anno non inserito!");
    		TextView outputAnno = (TextView) findViewById(R.id.outputAnno);
    		outputAnno.setText(anno);
    		
    		
    		final Intent startintent = new Intent(Set_anno.this,DBMain.class);
    		Button button=(Button)findViewById(R.id.button1);
            button.setOnClickListener(new OnClickListener() {
            	public void onClick(View v) {
    				startActivity(startintent);
            	
            }
    	});
    }}
    Inviato dal mio GT-H9500 utilizzando Tapatalk
  • Re: Shared preference al primo avvio

    Scusa ma a te serve creare un selettore con gli anni, giusto?
    qual è la parte di codice che ti crea questo selettore?
  • Re: Shared preference al primo avvio

    Attualmente in edittext con id inputanno immetto l'anno e lo salvo nelle shared, il pulsante di salvataggio e configurato ne layout set_anno. Tutto funziona perfettamente ma non riesco a capire in che punto dire alla classe qui sopra che se non imserisco nulla, di default mi prenda il valore 2014.

    Inviato dal mio GT-H9500 utilizzando Tapatalk
  • Re: Shared preference al primo avvio

    Ah ok, quando avevi detto "selettore" pensavo ti riferissi a un componente grafico come lo spinner..

    Per tornare alla tua domanda, attualmente se nelle shared prefs non è stato salvato l'anno allora restituisci la stringa "Anno non trovato". Se vuoi sostiture questa stringa con l'anno corrente puoi fare così:
    
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    String anno = prefs.getString(ANNO, Integer.toString(year));
    
    Se, invece, vuoi che nel caso in cui l'utente prema il pulsante lasciando l'edit text vuota allora venga preso l'anno corrente, allora basta che fai dei controlli sul contenuto dell'edit text all'interno del metodo "onClick"
  • Re: Shared preference al primo avvio

    Il top per me è quello di dar dei valori di default, infatti oltre l'anno ho anche altri 2 valori da preimpostare. Per non dilungarmi nel post ho citato il primo dei tre valori. Gli altri 2 sono rispettivamente 2 valori numerici che vado a mettere in una altra classe e che ho separato da quella dell'anno in quanto do la possibilità di cambiarli i caso di necessità. Il problema appunto che non preimpostandoli di default se uno non lo sa, al primo avvio l'app va in crash in quanto valori necessari per le select del db

    Inviato dal mio GT-H9500 utilizzando Tapatalk
Devi accedere o registrarti per scrivere nel forum
23 risposte