Autore Topic: Chiarimenti sui Settings  (Letto 569 volte)

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Chiarimenti sui Settings
« il: 15 Aprile 2014, 15:05:00 CEST »
0
Salve. Sto cercando di inserire nell'applicazione un menù dove impostare vari dati. I dati sono numerici. Ho creato un file prefs.xml dentro la cartella xml delle risorse. Il file per ora è questo:

Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceCategory
        android:summary="Timeouts for  the HTTP requests"
        android:title="Timeouts">
        <EditTextPreference
            android:key="track_connection_timeout"
            android:title="Track connection timeout"
            android:inputType="number"
            android:digits="0123456789"
            android:defaultValue="10000"/>
        <EditTextPreference
            android:key="track_download_timeout"
            android:title="Track download timeout"
            android:inputType="number"
            android:digits="0123456789"
            android:defaultValue="20000"/>
        <EditTextPreference
            android:key="elevation_connection_timeout"
            android:title="Elevation connection timeout"
            android:inputType="number"
            android:digits="0123456789"
            android:defaultValue="10000"/>
         <EditTextPreference
             android:key="elevation_download_timeout"
             android:title="Elevation download timeout"
             android:inputType="number"
             android:digits="0123456789"
             android:defaultValue="10000"/>
    </PreferenceCategory>
</PreferenceScreen>

Sto tentando di far inserire solo numeri, ma mi pare che questa soluzione non funzionasse.

Successivamente ho creato queste due classi:

SettingsActivity

Codice: [Seleziona]
public class SettingsActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();
    }
}

SettingsFragment

Codice: [Seleziona]
public class SettingsFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.prefs);
    }
}

Nell'Activity principale ho:

Codice: [Seleziona]
private int trackConnectionTimeout;
private int trackDataTimeout;
private int elevationConnectionTimeout;
private int elevationDataTimeout;

@Override
protected void onCreate(Bundle savedInstanceState) {

    ....

    //Caricamento delle preferenze
    PreferenceManager.setDefaultValues(MainActivity.this, R.xml.prefs, false);
    loadPreferences();

    ...
}

private void loadPreferences() {
        SharedPreferences sp = PreferenceManager.
                getDefaultSharedPreferences(MainActivity.this);
        trackConnectionTimeout = Integer.parseInt(sp.getString("track_connection_timeout",null));
        trackDataTimeout   = Integer.parseInt(sp.getString("track_download_timeout",null));
        elevationConnectionTimeout = Integer.parseInt(sp.getString("elevation_connection_timeout",null));
        elevationDataTimeout   = Integer.parseInt(sp.getString("elevation_download_timeout",null));
}

I problemi sono due:

1) Questa soluzione va bene solo dalle API 11 in su se non erro. Vorrei che fosse compatibile con tutte le versioni. Come faccio?

2) All'avvio dell'applicazione ottengo una "NumberFormatException" poiché non è possibile convertire un valore "null" in int. Ma i valori di default li ho inseriti quindi non capisco.

Grazie!


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Chiarimenti sui Settings
« Risposta #1 il: 15 Aprile 2014, 18:31:28 CEST »
0
1) Crea una activity non con PreferenceFragment, ma direttamente estendendo PreferenceActivity. Appare sostanzialmente così:

Codice (Java): [Seleziona]
public class Prefs  extends PreferenceActivity {

   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);    
     addPreferencesFromResource(R.xml.prefs);
   }
   
}


2) Tutto quello che vai a scrivere e leggere da un EditTextPreference è una stringa, anche se ci metti un numero. Quindi tu fai conto di usare sempre String e converti in numero dopo aver prelevato dalla preference.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Re:Chiarimenti sui Settings
« Risposta #2 il: 15 Aprile 2014, 20:28:49 CEST »
0
La prima soluzione non è attuabile.

addPreferencesFromResource(R.xml.prefs); è deprecato.

Per il secondo problema ho fatto come hai detto ma ho un piccolo problema. Se vado a cancellare il contenuto di una o più EditTextPreference, chiudo l'app e la riapro ottengo eccezione poiché non è possibile convertire "" in int, e gli altri valori non vengono inizializzati. Come posso fare?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Chiarimenti sui Settings
« Risposta #3 il: 16 Aprile 2014, 07:42:57 CEST »
0
Se vuoi che funzioni su api 8 devi usare il metodo deprecato, non credo tu abbia alternative.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Re:Chiarimenti sui Settings
« Risposta #4 il: 16 Aprile 2014, 09:09:49 CEST »
0
Mmm, va bene. E per il secondo problema? Non c'è un modo per evitare di cancellare il contenuto delle EditText? E anche per consentire solo l'inserimento di numeri?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Chiarimenti sui Settings
« Risposta #5 il: 16 Aprile 2014, 09:44:33 CEST »
0
Dove scrivi

sp.getString("elevation_download_timeout",null)

invece di null metti il numero di default che ci deve essere in caso sia vuota, così risolvi il problema dei null
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Re:Chiarimenti sui Settings
« Risposta #6 il: 16 Aprile 2014, 10:17:32 CEST »
0
Ah scusami, io già l'ho fatto mettendo "0" a tutti i campi, ma da comunque eccezione se cancello il contenuto poiché l'app rileva "".