如何在安卓系统中设置偏好?

24

我真的很苦恼。对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

现在出现了“偏好设置”。这是我的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>

接下来看一下“weight 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;
 }}

 );}
 }

提供一份完整的教程和示例代码会非常棒,因为我还没有找到任何可靠的指南。


看起来你在这里有保存偏好设置的代码...但是你的“公式”代码是否正在从保存偏好设置的位置读取 - matt b
嗯,我不这么认为。我有两个.java文件:DrinkingBuddy.java和Preferences.java。后者是显示的最后一段代码,而其他所有内容都在DrinkingBuddy.java中。再次强调,从“addsPreferencesFromResource…”以下的所有内容都只是我随意添加的,以尝试让它正常工作。 - Dan T
这里有几个帮助我的教程:http://viralpatel.net/blogs/android-preferences-activity-example/ 和 http://www.brighthub.com/mobile/google-android/articles/116373.aspx - MarkHu
3个回答

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
    }
}
偏好设置的更新保存已经为您处理好了。

(不太确定关于公共/私有声明!)

这很奇怪。我使用了BeerOunces来进行测试(我有一个toast显示“你添加了x盎司的啤酒”)。现在问题是...变量保留了我一开始分配的值(12),但当它在toast中显示时,它显示了首选项值(24)。即使我将原始值更改为只有BeerOunces;(没有分配值),它仍然会以零的形式计入方程式,而toast显示24。到底是怎么回事。 - Dan T
我不能真正为你调试应用程序 :) 但我意识到我提到了偏好权重值,我认为应该是weightPref(现已更正)。 - ChrisV
@ChrisV: +1。好答案。如果别人拥有这个手机(像导出数据库那样),他们能够查看 Shared Preferences 的 XML 文件吗?我问这个问题是因为我想在 Shared Preference 中存储当前用户的用户名和密码。 - Ashwin

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

同时,您不需要编辑器。偏好设置会自动保存。


不,我认为我的问题更基本一些。这并不是一个bug,只是缺乏知识。 - Dan T
2
@Dan T 你有检查我说的吗?这非常重要,如果你有两个不同的文件来存储偏好设置,那将无法正常工作。 - Pentium10
没错,那里都很好,我只是还没有实现必要的代码。谢谢! - Dan T

0
对于大多数应用程序而言,使用默认的共享首选项是最方便的。您可以在应用程序中的任何位置使用以下代码获取它们:
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

您可以使用以下代码将新变量保存到其中:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接