【问题标题】:How do I get preferences to work in Android?如何获得在 Android 中工作的首选项?
【发布时间】:2011-03-01 23:53:08
【问题描述】:

我真的一直在努力解决这个问题。 Java/Android 新手。我正在编写我的第一个应用程序,这是我花了几天时间才弄清楚的第一件事。这是设置:这是一个 BAC 计算器/饮料计数器:

使用公式计算 BAC。这是论坛:

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

如您所见,能够修改性别和体重将产生更准确和个性化的结果。所以我把它们当作双打:

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

要更改这些变量,我希望该人能够进入设置并选择不同的值。我已经设置了这些东西,但没有链接到上面显示的变量,因为我一生都无法弄清楚如何。他们在这里:

我按下菜单按钮,这会弹出。伟大的。我会点击设置。

现在首选项弹出。这是我的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>

前进到权重ListPreference:

然后就出现了。这些值作为字符串数组存储在 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;
 }}

 );}
 }

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

【问题讨论】:

  • 您似乎在此处有代码来保存首选项...但是您的“公式”代码 从保存首选项的位置读取吗?跨度>
  • 嗯,我不这么认为。我有 2 个 .java 文件:DrinkingBuddy.java 和 Preferences.java。后者是显示的最后一段代码,而其他所有代码都在 DrinkingBuddy.java 中。再一次,“addsPreferencesFromResource...”行下面的所有内容都是我为了让它工作而扔在那里的废话。

标签: android variables settings preferences sharedpreferences


【解决方案1】:

我仍在自己解决所有这些问题,但是(在某种程度上改编自我的版本)我认为您的 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,所以我可以测试它(我有一个吐司说“你加了 x oz 啤酒”)。现在问题是......变量保留了我在开始时分配的值(12),但是当它显示在 toast 中时,它显示了偏好值(24)。即使我将原件更改为 BeerOunces; (没有分配值)它只是将等式中的因子设为零,而 toast 显示 24. WTHell。
  • 我不能真正为你调试你的应用程序 :) 但我意识到我提到了我认为应该是 weightPref 的偏好 weightValues(现已更正)
  • @ChrisV:+1。好答案。如果某人有电话,是否可以查看共享首选项的 XML 文件(例如导出 XML 文件,就像您可以导出数据库一样)?我问这个是因为,我打算将当前用户的用户名和密码存储在 Shared Preference 中。
【解决方案2】:

您可能正在请求两组不同的首选项文件。

确保将 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);

您也不需要编辑器。首选项会自动保存。

【讨论】:

  • 不,我认为我的问题更为根本。没有错误,只是不知道怎么做。
  • @Dan T 你检查过我说的吗?如果您有两个不同的文件来存储无法正常工作的首选项,这一点非常重要。
  • 是的,一切都很好,我只是没有实现任何必要的代码。谢谢!
【解决方案3】:

对于大多数应用程序,使用默认共享首选项最为方便。您可以通过以下方式从应用程序中的任何位置获取它们:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多