Autore Topic: Shared Preferences uno spinner due array  (Letto 690 volte)

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Shared Preferences uno spinner due array
« il: 11 Febbraio 2014, 10:39:49 CET »
0
Salve a tutti,
non riesco a gestire due preferenze!

Ho un file con due array del tipo (descrizione-valore)
descrizione > italiano
valore > it
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="UTF-8"?>
<resources>
  <string-array name="nome_lingua">
    <item>italiano</item>
    <item>francese</item>
    <item>spagnolo</item>
    <item>tedesco</item>
  </string-array>
  <string-array name="sigla_lingua">
    <item>it</item>
    <item>fr</item>
    <item>es</item>
    <item>de</item>
  </string-array>
</resources>
Codice (Java): [Seleziona]
public class IndexActivity extends Activity {
        Button btn1, btn2;
        Spinner s;
        String sigla1, nome1, valore, prefs, sito1="http://www.google.com/";
        String prefText = "";
       
        public SharedPreferences pref;
        public SharedPreferences salvaNome;
        public SharedPreferences.Editor editor;
               
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.index);
                super.onResume();              
                pref = getSharedPreferences ("FILE_PREF", MODE_PRIVATE);
                String sigla1 = pref.getString("Sigla1", "vuota");
                String nome1 = pref.getString("Nome1", "vuota");

        s = (Spinner) findViewById(R.id.mio_spinner);
        final ArrayAdapter<CharSequence>
        sceltaLingua = ArrayAdapter.createFromResource(this, R.array.nome_lingua, android.R.layout.simple_spinner_item);
        sceltaLingua.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s.setAdapter(sceltaLingua);
     
        s.setOnItemSelectedListener(new OnItemSelectedListener() {      
                        @Override
                        public void onItemSelected(AdapterView<?> arg0, View arg1, int posizione, long id) {
                                String arraySigle[] = getResources ().getStringArray(R.array.sigla_lingua);
                                String arrayNome[] = getResources ().getStringArray(R.array.nome_lingua);
                               
                                editor = pref.edit();
                                editor.putString("Sigla1",arraySigle[posizione].toString());
                                editor.putString("Nome1",arrayNome[posizione].toString());
                                editor.commit();
                       
                                // Toast.makeText(getApplicationContext(),arraySigle[posizione].toString(), Toast.LENGTH_LONG).show();
                                Toast.makeText(getApplicationContext(),arrayNome[posizione].toString(), Toast.LENGTH_LONG).show();     
                               
                        }

                        @Override
                        public void onNothingSelected(AdapterView<?> arg0) {

                        }
        });

        Uri apreweb = Uri.parse(sito1 + sigla1);    
            Intent browserintent = new Intent(Intent.ACTION_VIEW, apreweb);
            browserintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(browserintent);    
        }
}

Attualmente sul mio spinner  visualizzo “nome_lingua” ma passo il valore di "sigla_lingua" che poi aggiungo alla URL di base che comporrà l'indirizzo completo da aprire sul browser.
il problema é che al riavvio dell’app lo spinner riparte d’all’inizio anziché dalla scelta precedentemente fatta.
il valore della sigla viene invece correttamente richiamato dalla preferenza.

Come dovrei modificare il mio codice?
Mi aiutate in questo mio grande desiderio?
Grazie a tutti.

iClaude

  • Visitatore
Re:Shared Preferences uno spinner due array
« Risposta #1 il: 11 Febbraio 2014, 16:00:04 CET »
0
Non ho letto il codice, tuttavia puoi usare il metodo setSelection(int position) dello Spinner per impostare il valore iniziale che hai salvato nelle preferenze.

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Shared Preferences uno spinner due array
« Risposta #2 il: 11 Febbraio 2014, 17:11:11 CET »
0
Io faccio una cosa semplice... memorizzo l'indice (certo che se cambia da una versione all'altra dell'App ti crea problemi).

   private class MySpinnerListener implements AdapterView.OnItemSelectedListener
    {
        public void onItemSelected(AdapterView<?> parent, View view,
                                   int pos, long id)
        {
            mSelected = pos;
        }
   ...
   }
    private MySpinnerListener mSpinnerListener = new MySpinnerListener();

    @Override
    protected void onStop() {
        super.onStop();

        SharedPreferences.Editor prefEdit = getPreferences( MODE_PRIVATE ).edit();
        prefEdit.putInt( SELECTED_KEY, mSelected );
        prefEdit.commit();
    }


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        ...

        mSelected = getPreferences( MODE_PRIVATE ).getInt( SELECTED_KEY, SELECTED_DEFAULT );

        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        spinner.setSelection( mSelected );
        spinner.setOnItemSelectedListener(mSpinnerListener);

        ...
    }

Ciao.

Post unito: 11 Febbraio 2014, 17:17:19 CET
Cmq, a prescindere dal discorso dello Spinner.

In Java per passare dal LanguageTag al nome della lingua visualizzabile c'è il metodo Locale.getDisplayLanguage()

Che ti ritorna il nome di tutte le lingua in tutte la lingue.
Cioé
   English
   Italian
   French
in inglese

   Inglese
   Italiano
   Francese
in italiano

e così via...
« Ultima modifica: 11 Febbraio 2014, 17:17:19 CET da arlabs, Reason: Merged DoublePost »

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Re:Shared Preferences uno spinner due array
« Risposta #3 il: 12 Febbraio 2014, 11:08:34 CET »
0
Grazie per i consigli,
Il metodo Locale.getDisplayLanguage() serve a restituire la lingua del dispositivo, non è quello che vorrei ottenere.

Voglio passare la sigla della lingua da accodare ad una url predefinita indipendentemente dalla lingua del dispositivo.
Con il codice da me postato lo ottengo di già questo risultato,
ciò che non riesco a fare e salvare la posizione dello spinner per il prossimo riavvio.
Anche provando il metodo setSelection(int position) dello Spinner.
Non riesco a capire dove sbaglio.

Sono apprezzati suggerimenti.

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Shared Preferences uno spinner due array
« Risposta #4 il: 12 Febbraio 2014, 14:39:00 CET »
0
Se salvi l'ID e poi nella successiva onCreate fai setSelection dovrebbe funzionare (per lo meno a me funziona).
Se posti il codice con la setSelection che non funziona, magari ti possiamo aiutare a capire perché non va.

A proposito dei Locale, puoi instanziare quanti oggetti vuoi per ogni lingua, non solo per quella corrente. Intendo:

        Locale englishLoc = new Locale( "EN" );
        Locale italianLoc = new Locale( "IT" );
        String italiano = italianLoc.getDisplayLanguage( italianLoc );
        String inglese = englishLoc.getDisplayLanguage( italianLoc );
        String italian = italianLoc.getDisplayLanguage( englishLoc );
        String english = englishLoc.getDisplayLanguage( englishLoc );

Ciao.

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Re:Shared Preferences uno spinner due array
« Risposta #5 il: 13 Febbraio 2014, 12:26:41 CET »
0
L'errore deriva dal fatto che il metodo setSelection(int position) é applicabile ad un boleano mentre io sto richiamando delle stringhe.
Non sò come andare avanti.

Post unito: 13 Febbraio 2014, 12:49:53 CET
Ho provato così, non ottengo errori ma non succede nulla, lo spinner parte sempre dal primo elemento.

// --- prima di OnCreate ---
   public SharedPreferences salvaNome;
   private String prefNome = "";
   int id = 0;

// ----- su OnCreate -----
        s = (Spinner) findViewById(R.id.mio_spinner);
        final ArrayAdapter<CharSequence>
        sceltaLingua = ArrayAdapter.createFromResource(this, R.array.nome_lingua, android.R.layout.simple_spinner_item);
        sceltaLingua.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s.setAdapter(sceltaLingua);
        salvaNome = getSharedPreferences(prefNome, MODE_PRIVATE);
        id = salvaNome.getInt("Scelta",0);
        s.setSelection(id);

il resto del codice é come allegato.

Cosa dimentico o dove sbaglio? :-( :-( :-(
« Ultima modifica: 13 Febbraio 2014, 12:49:53 CET da astropegaso61, Reason: Merged DoublePost »

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Shared Preferences uno spinner due array
« Risposta #6 il: 13 Febbraio 2014, 14:24:21 CET »
0
setSelection a me funziona tranquillamente con una lista di stringhe.
Sei sicuro che l'id della scelta lo salvi?

Codice: [Seleziona]
getSharedPreferences(prefNome, MODE_PRIVATE).setInt("Scelta", indice );

Io lo faccio nella OnStop.

Cmq io, a differenza tua, lo spinner non lo riempio da codice ma lo definisco in XML
Non so se possa essere questa la differenza. Magari avendolo appena riempito non funziona la setSelection? Mah...

Codice: [Seleziona]
            <Spinner
                android:id="@+id/mio_spinner"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:entries="@array/nome_lingua"
                android:focusable="false"
                android:spinnerMode="dropdown"
                android:visibility="invisible" />

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Re:Shared Preferences uno spinner due array
« Risposta #7 il: 20 Febbraio 2014, 13:08:11 CET »
0
Grazie a Tutti :D :D