2010-06-10 4 views
24

Я действительно боролся с этим. Новое в Java/Android. Я пишу свое первое приложение, и это первое, что заняло у меня больше времени, чем пару дней поиска. Вот настройки: Это калькулятор БАК/напиток счетчик:Как мне получить предпочтения для работы в Android?

alt text

формула используется для расчета концентрации алкоголя в крови. Вот Forumla:

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

Так как вы можете видеть, будучи в состоянии изменить пол и вес будет производить более точные и персонализированные результаты. Так что у меня их два раза:

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

Для изменения этих переменных я хотел бы человек, чтобы иметь возможность зайти в настройки и выбрать различные значения. У меня эти вещи настроены, но не связаны с переменными, показанными выше, потому что я не могу на всю жизнь понять, как это сделать. Вот они:

alt text

я нажимаю кнопку меню, и это всплывает. Отлично. Я нажму Настройки.

alt text

Теперь предпочтения выскочит. Вот мой 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> 

Onward весовому ListPreference:

alt text

И это показывает вверх. Значения сохраняются в виде массивов строк в res/values ​​/ arrays.xml. Вот пример, только весовых:

<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> 

Это в основном до тех пор, пока я не получил. Я могу щелкнуть значение, конечно, но оно не меняет формулу, потому что оно не связано с двойниками, которые я создал в DrinkingBuddy.java. Все элементы, отображаемые в настройках, теперь являются пустыми оболочками, включая прядильщик на основном макете (время по умолчанию только 1 час)

Я создал Preferences.java и попытался реализовать различные комбинации кода, найденного в учебных пособиях и ресурсах в Интернете, но безрезультатно. Вот оно все равно, наполненная неудачных попыток сделать beerPref (параметр настройки изменить, сколько унций в пиве) коррелируют с переменной в мой основной класс:

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; 
}} 

);} 
} 

полностью на учебник и примеры кода будет УДИВИТЕЛЬНО, поскольку мне еще предстоит найти надежные руководства.

+0

кажется, у вас есть код здесь, чтобы сохранить предпочтения ... но это ВАШ код для «формулы» * чтение * с того места, где сохраняется предпочтение? –

+0

Ummm Я так не думаю. У меня есть 2 файла .java: DrinkingBuddy.java и Preferences.java. Последний - последний бит показанного кода, а все остальное - в DrinkingBuddy.java. Еще раз, все, что находится под строкой, которая «добавляетПримечанияFromResource ...» - это просто дерьмо, которое я бросил туда, чтобы попытаться заставить его работать. –

+0

Вот несколько обучающих программ, которые помогли мне: http://viralpatel.net/blogs/android-preferences-activity-example/ и http://www.brighthub.com/mobile/google-android/articles/116373. aspx – MarkHu

ответ

4

Вы запрашиваете, вероятно, два разных набора файлов предпочтений.

Убедитесь, что вы сохранили значения ListPreference в тех же файлах. Запуск adb рулон до cd /data/data/com.your.package и поиск папок и файлов с типом предпочтений.

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

Попробуйте изменить это:

SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE); 

в

SharedPreferences preferences = PreferenceManager 
       .getDefaultSharedPreferences(context); 

Тогда вам вероятно, придется запрашивать только

preferences.getString('weightPref', null); 

Также вам не нужен редактор. Настройки сохраняются автоматически.

+0

Нет, я думаю, что моя проблема гораздо более фундаментальна. Нет ошибки, просто отсутствие знания. –

+2

@ Dan T Вы проверили, что я сказал? Это очень важно, если у вас есть два разных файла для сохранения предпочтений, которые не будут хорошо работать. – Pentium10

+0

Да, все хорошо, я просто не выполнил ни одного необходимого кода. Благодаря! –

17

Я все еще работаю все это из себя, но (несколько адаптировано из моей версии) Я думаю, что ваш класс Preferences нужно только сделать следующее:

public class Preferences extends PreferenceActivity { 

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

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

Затем в главном классе, вы можете обратиться к предпочтениям:

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 
    } 
} 

Сохранение обновлений предпочтений обрабатывается для вас.

(не слишком уверен в государственных/частных декларациях!)

+0

Это выглядит великолепно. Я дам ему попробовать как можно скорее. Спасибо! –

+0

Хммм это очень странно. Я использовал BeerOunces, чтобы проверить его (у меня есть тост, в котором говорится: «Вы добавили пиво x oz»). Теперь дело в том, что ... переменная сохраняет значение, которое я ему назначаю в начале (12), но когда оно отображается в тосте, оно показывает значение предпочтения (24). Даже если я изменю оригинал только на BeerOunces; (без присвоения значения) он просто влияет на уравнение как ноль, а тост отображает 24. WTHell. –

+0

Я не могу отлаживать ваше приложение для вас :), но я понимаю, что я упомянул о предпочтении weightValues, который, я думаю, должен был быть weightPref (теперь исправлено) – ChrisV

0

Для большинства приложений, наиболее удобно использовать по умолчанию общих предпочтений. Вы можете получить из любой точки мира в вашем приложении им:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 

Вы можете сохранить новые переменные в нее:

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

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

  • Нет связанных вопросов^_^