如何获得在Android中工作的偏好设置?

Dan*_*n T 24 variables settings android preferences sharedpreferences

我真的在努力解决这个问题.Java/Android新手.我正在编写我的第一个应用程序,这是第一件让我花费超过几天寻找的应用程序.这是设置:这是一个BAC计算器/饮料柜台:

替代文字

公式用于计算BAC.这是论坛:

Bac = ((StandardDrinks / 2) * (GenderConstant / Weight)) - (0.017 * Hours);
Run Code Online (Sandbox Code Playgroud)

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

double GenderConstant = 7.5; //9 for female
double Weight = 180;
Run Code Online (Sandbox Code Playgroud)

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

替代文字

我按下菜单按钮,然后弹出.大.我将点击"设置".

替代文字

现在弹出首选项.这是我的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>
Run Code Online (Sandbox Code Playgroud)

继续权重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>
Run Code Online (Sandbox Code Playgroud)

这基本上就我所知.我可以点击一个值,当然,它不会改变公式,因为它没有与我在DrinkingBuddy.java中创建的双打链接.设置中显示的所有内容现在都只是空壳,包括主布局上的微调器(默认时间设置为1小时)

我确实创建了一个Preferences.java,并尝试在Web上的教程和资源中实现各种代码组合,但无济于事.无论如何,这是完全失败的尝试使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;
 }}

 );}
 }
Run Code Online (Sandbox Code Playgroud)

完整的教程和示例代码将是真棒,因为我还没有找到任何可靠的指南.

Chr*_*isV 17

我自己仍在使用这一切,但是(稍微改编自我的版本)我认为你的Preferences类只需要执行以下操作:

public class Preferences extends PreferenceActivity {

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

        // load the XML preferences file
        addPreferencesFromResource(R.xml.preferences);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的主类中,您可以参考首选项:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

为您处理保存首选项更新.

(对公共/私人声明不太确定!)


Pen*_*m10 4

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

确保将 ListPreference 值存储在同一文件中。启动adb滚动到cd /data/data/com.your.package并查找类型首选项的文件夹和文件。

我认为错误在于您指定的文件与保存设置的文件不同:

尝试改变这个:

SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)

SharedPreferences preferences = PreferenceManager
                .getDefaultSharedPreferences(context);
Run Code Online (Sandbox Code Playgroud)

那么你可能只需要查询

preferences.getString('weightPref', null);
Run Code Online (Sandbox Code Playgroud)

而且你也不需要 Editor。首选项会自动保存。

  • @Dan T 你检查过我所说的吗?如果您有两个不同的文件来存储效果不佳的首选项,这一点非常重要。 (2认同)