我真的在努力解决这个问题。 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,并尝试在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;
}}
);}
}
完整的教程和示例代码将是非常棒的,因为我还没有找到任何可靠的指南。
答案 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
}
}
为您处理保存偏好更新。
(对公共/私人声明不太确定!)
答案 1 :(得分: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);
此外,您不需要编辑。首选项会自动保存。
答案 2 :(得分:0)
对于大多数应用程序,使用默认的共享首选项最为方便。您可以从以下任何地方获取:
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
您可以使用以下方法将新变量保存到其中:
sp.edit().putString("var_name", "var value".apply();