我如何获得偏好在Android中工作?

我真的一直在努力通过这个。 Java / Android新手 我正在写我的第一个应用程序,这是第一件事花了我几天的时间寻找解决。 这是设置:这是一个BAC计算器/饮料柜台:

替代文字

一个公式被用来计算BAC。 这里是forumla:

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

正如你所看到的,能够修改性别和体重会产生更准确和个性化的结果。 所以我把他们当作双打:

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

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

替代文字

我按下菜单button,这popup。 大。 我将点击设置。

替代文字

现在,首选项popup。 这是我的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:

替代文字

那出现了。 这些值作为string数组存储在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中创build的双打。 所有显示在设置中的东西现在都是空壳,包括主布局上的微调框(默认时间设置为1小时)

我确实创build了一个Preferences.java,并试图在Web上的教程和资源中实现各种代码组合,但无济于事。 在这里,无论如何,充满了尝试使beerPref(设置选项改变啤酒中的多less盎司)失败的尝试与我的主类中的variables相关联:

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

一个完整的教程和示例代码将是真棒,因为我还没有find任何可靠的指导。

Solutions Collecting From Web of "我如何获得偏好在Android中工作?"

我仍然自己工作,但(从我的版本有所改变),我认为你的喜好类只需要做到以下几点:

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

偏好更新的保存是为您处理的。

(不太清楚公共/私人声明!)

您可能需要两个不同的首选项文件。

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

我认为这个错误是你指定了一个不同的文件,

尝试改变这一点:

 SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE); 

 SharedPreferences preferences = PreferenceManager .getDefaultSharedPreferences(context); 

那么你可能只需要查询

 preferences.getString('weightPref', null); 

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

对于大多数应用程序,使用默认的共享首选项是最方便的。 你可以从任何地方得到应用他们:

 SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 

您可以使用以下方法将新variables保存

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