Как получить настройки для работы в Android? - PullRequest
24 голосов
/ 10 июня 2010

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

alt text

Формула используется для расчета BAC. Вот форум:

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

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

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

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

alt text

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

alt text

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

Вперед к весу 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;
 }}

 );}
 }

Полный учебник и пример кода были бы УДИВИТЕЛЬНЫМИ, так как я еще не нашел надежных руководств.

Ответы [ 3 ]

17 голосов
/ 11 июня 2010

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

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

Сохранение обновлений настроек выполнено за вас.

(Не слишком уверен насчет публичных / частных объявлений!)

4 голосов
/ 10 июня 2010

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

Убедитесь, что вы храните значения 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 голосов
/ 03 июля 2014

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

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

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

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