2010-06-10 17 views
24

Realmente he estado luchando con esto. Nuevo en Java/Android. Estoy escribiendo mi primera aplicación y esta es la primera cosa que me ha tomado más de un par de días de búsqueda para averiguarlo. Aquí está la disposición: Es un contador de la calculadora de BAC/bebida:¿Cómo obtengo preferencias para trabajar en Android?

alt text

Una fórmula se utiliza para calcular la tasa de alcoholemia. Aquí está la forumla:

Bac = ((StandardDrinks/2) * (GenderConstant/Weight)) - (0.017 * Hours); 

Así como se puede ver, ser capaz de modificar el sexo y el peso va a producir resultados más precisos y personalizados. Así que les tengo como dobles:

double GenderConstant = 7.5; //9 for female 
double Weight = 180; 

Para cambiar estas variables Me gustaría que la persona sea capaz de entrar en la configuración y elegir valores diferentes. Tengo estas cosas configuradas, pero no están vinculadas a las variables que se muestran arriba porque no puedo, por la vida de mí, descubrir cómo. Aquí están:

alt text

pulsar el botón de menú y esto aparece. Estupendo. Haré clic en Configuración.

alt text

Ahora las preferencias aparece. Aquí es mi preferences.xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

<PreferenceCategory android:title="Personal Settings"> 


<ListPreference 
android:title="Gender" 
android:summary="Verify or deny the presence of a Y chromosome." 
android:key="genderPref" 
android:defaultValue="male" 
android:entries="@array/genderArray" 
android:entryValues="@array/genderValues" /> 

<ListPreference 
android:title="Weight" 
android:summary="How much the planet pulls on you, in pounds." 
android:key="weightPref" 
android:defaultValue="180" 
android:entries="@array/weightArray" 
android:entryValues="@array/weightValues" /> 

</PreferenceCategory> 

<PreferenceCategory android:title="Drink Settings"> 

<ListPreference 
android:title="Beer Size" 
android:summary="The volume of your beer, in ounces." 
android:key="beerPref" 
android:defaultValue="12" 
android:entries="@array/beerArray" 
android:entryValues="@array/beerValues" /> 

<ListPreference 
android:title="Shot Size" 
android:summary="The volume of your shot, in ounces." 
android:key="shotPref" 
android:defaultValue="1.5" 
android:entries="@array/shotArray" 
android:entryValues="@array/shotValues" /> 

<ListPreference 
android:title="Wine Size" 
android:summary="The volume of your wine, in ounces." 
android:key="winePref" 
android:defaultValue="5" 
android:entries="@array/wineArray" 
android:entryValues="@array/wineValues" /> 


</PreferenceCategory> 
</PreferenceScreen> 

Adelante a la ListPreference peso:

alt text

Y que aparece. Los valores se almacenan como matrices de cadenas en res/values ​​/ arrays.xml. Aquí hay una muestra, solo de las de peso:

<string-array name="weightArray"> 
<item>120 lbs</item> 
<item>150 lbs</item> 
<item>180 lbs</item> 
<item>210 lbs</item> 
<item>240 lbs</item> 
<item>270 lbs</item> 
</string-array> 
<string-array name="weightValues"> 
<item>120</item> 
<item>150</item> 
<item>180</item> 
<item>210</item> 
<item>240</item> 
<item>270</item> 
</string-array> 

Esto es básicamente lo más lejos que he llegado. Puedo hacer clic en un valor, claro, pero no cambia la fórmula porque no está vinculado con los dobles que creé en DrinkingBuddy.java. Todas las cosas que se muestran en la configuración son solo conchas vacías por ahora, incluido el ruteador en el diseño principal (el tiempo predeterminado es solo 1 hora)

Creé un Preferences.java y he intentado implementar varias combinaciones de código encontrado en tutoriales y recursos en la web, pero fue en vano. Aquí está de todos modos, llena de intentos fallidos de hacer beerPref (la opción de configuración para cambiar la cantidad de onzas en la cerveza) se correlacionan con una variable en mi clase principal:

package com.dantoth.drinkingbuddy; 


import android.app.Activity; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.Preference; 
import android.preference.PreferenceActivity; 
import android.preference.Preference.OnPreferenceClickListener; 


public class Preferences extends PreferenceActivity { 

public static final String PREF_BEER_SIZE = "PREF_BEER_SIZE"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
addPreferencesFromResource(R.xml.preferences); 

//Get the custom preference 



Preference beerPref = (Preference) findPreference("beerPref"); 
beerPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { 

public boolean onPreferenceClick(Preference preference) { 

SharedPreferences customSharedPreference = getSharedPreferences("myCustomSharedPrefs", Activity.MODE_PRIVATE); 
SharedPreferences.Editor editor = customSharedPreference.edit(); 

editor.commit(); 
return true; 
}} 

);} 
} 

un lleno en el tutorial y código de ejemplo sería IMPRESIONANTE ya que todavía tengo que encontrar guías confiables por ahí.

+0

parece que tiene código aquí para salvar una preferencia ... pero es su código para "la fórmula" * leyendo * del lugar donde se guarda la preferencia? –

+0

Ummm No lo creo. Tengo 2 archivos .java: DrinkingBuddy.java y Preferences.java. Este último es el último fragmento de código que se muestra, mientras que todo lo demás está en DrinkingBuddy.java. Una vez más, todo lo que está por debajo de la línea que "agregaPreferenciasFromResource ..." es una porquería que lancé allí para tratar de que funcione. –

+0

Aquí hay algunos tutoriales que me han ayudado: http://viralpatel.net/blogs/android-preferences-activity-example/ y http://www.brighthub.com/mobile/google-android/articles/116373. aspx – MarkHu

Respuesta

4

Usted está solicitando probablemente dos conjuntos diferentes de archivos de preferencias.

Asegúrese de almacenar los valores ListPreference en los mismos archivos. Poner en marcha adb rodar al cd /data/data/com.your.package y buscar carpetas y archivos de tipo preferencias.

Creo que el fallo es que especifica un archivo diferente a la que el ajuste se ha guardado también:

Intente cambiar esto:

SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE); 

a

SharedPreferences preferences = PreferenceManager 
       .getDefaultSharedPreferences(context); 

A continuación, probablemente tenga que consultar solo

preferences.getString('weightPref', null); 

También usted no necesita el Editor. Las preferencias se guardan automáticamente.

+0

No, creo que mi problema es mucho más fundamental. No hay errores, solo falta saber cómo. –

+2

@Dan T ¿Has revisado lo que dije? Es muy importante si tiene dos archivos diferentes para almacenar las preferencias que no funcionarán bien. – Pentium10

+0

Sí, todo está bien allí, simplemente no había implementado ninguno de los códigos necesarios. ¡Gracias! –

17

Todavía estoy trabajando todo esto por mí mismo, pero (algo adaptado de mi versión) Creo que su clase Preferencias sólo tiene que hacer lo siguiente:

public class Preferences extends PreferenceActivity { 

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

     // load the XML preferences file 
     addPreferencesFromResource(R.xml.preferences); 
    } 
} 

Luego, en su clase principal, puede hacer referencia a las preferencias:

public class DrinkingBuddy extends Activity 
          implements OnSharedPreferenceChangeListener { 

    private int weight; 

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

     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 

     // register preference change listener 
     prefs.registerOnSharedPreferenceChangeListener(this); 

     // and set remembered preferences 
     weight = Integer.parseInt((prefs.getString("weightPref", "120"))); 
     // etc 
    } 

    // handle updates to preferences 
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
     if (key.equals("weightValues")) { 
      weight = Integer.parseInt((prefs.getString("weightPref", "120"))); 
     } 
     // etc 
    } 
} 

El ahorro de las actualizaciones de preferencias se maneja para usted.

(No es muy seguro acerca de las declaraciones públicas/privadas!)

+0

Esto se ve genial. Lo intentaré lo antes posible. ¡Gracias! –

+0

Hmmm esto es muy extraño. Usé BeerOunces para poder probarlo (tengo una tostada que dice "Agregaste una cerveza de x oz"). Ahora lo que pasa es que ... la variable mantiene el valor que le asigné al comienzo (12), pero cuando se muestra en la tostada, muestra el valor de preferencia (24). Incluso si cambio el original a solo BeerOunces; (sin ningún valor asignado) solo factores en la ecuación como un cero, mientras que el tostado muestra 24. WTHell. –

+0

No puedo depurar realmente tu aplicación :) pero me doy cuenta de que me he referido a valores de peso preferidos que creo que deberían haber sido weightPref (ahora corregidos) – ChrisV

0

Para la mayoría de aplicaciones, es más conveniente utilizar las preferencias compartidas por defecto. Se puede llegar desde cualquier punto de que los APP con:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 

Puede guardar nuevas variables en él con:

sp.edit().putString("var_name", "var value".apply(); 
Cuestiones relacionadas