我一直在尝试使用Android首选项活动,我已经完成所有设置,但实际上我无法检索用户首选项。具体来说,它是两个edittext首选项,术语长度和年份长度,我想要检索作为int的值,以便我可以在另一个活动的计算中使用它们。
我找到的每个例子都不同,我无法找到明确的解释。我将在下面发布我正在使用的类和方法,我知道那里的代码不正确,但我觉得我现在已经把它弄乱了,并且无法解决它。这条线特别是我不相信是正确的:SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
并且我并不真正理解整体上的偏好活动,它们似乎没有像我期望的那样工作。任何建议真的很棒!几天来,我一直在处理相同的代码行
谢谢。
我的偏好设置活动如下:
package com.geistware.studentbudgetapp;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.text.method.DigitsKeyListener;
import android.util.Log;
public class UserPrefs extends PreferenceActivity {
public int termLength = 1;
public int yearLength = 1;
@Override //OnCreate never runs, why?
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.setup);
EditTextPreference usersTermLength =(EditTextPreference)
findPreference(getString(R.string.term_length_set)); //finds
//the edittext box by its key, term_length_set
usersTermLength.getEditText().setKeyListener(DigitsKeyListener.
getInstance()); //DigitsKeyListener only allows digits to be typed in
Log.v("UserPrefs", "UsersTermLength: " + usersTermLength);
EditTextPreference usersYearLength =(EditTextPreference)
findPreference(getString(R.string.year_length_set));
usersYearLength.getEditText().setKeyListener(DigitsKeyListener.
getInstance());
}
}
我希望能够在此方法中检索用户termLength和yearLength(作为整数):
public float alterForFrequency(float enteredAmount, String spinnerPosition){
//get user preferences (not working)
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String termKey = getString(R.string.term_length_set, "");
String yearKey = getString(R.string.year_length_set, "");
int termLength = prefs.getInt(termKey, 1);
int yearLength = prefs.getInt(yearKey, 1);
Log.v("alterForFrequency", "userprefs: " + termLength + yearLength);
//perform calculations for monthly/temly/yearly
if(spinnerPosition.equals("Monthly")){
usersAmount = ((enteredAmount / 31)* 7);
Log.v("FiscFreq", "revisingAmount=" + usersAmount);
}
else if(spinnerPosition.equals("Termly")){
usersAmount = (enteredAmount / termLength);
Log.v("FiscFreq", "revisingAmount=" + usersAmount);
}
else if(spinnerPosition.equals("Yearly")){
usersAmount = (enteredAmount / yearLength);
}
else{
usersAmount = enteredAmount;
}
currencyRevisedAmount = toCurrency(usersAmount); //drops the unwanted digits
return currencyRevisedAmount;
}
我实际上正在创建一个FiscalFrequency实例,以便在名为Keypad的活动中使用alterForFrequency,如下所示:
public class Keypad extends Activity { .....
public float reviseOnSpinnerPos(){
enteredAmount = Float.valueOf(userAmount.getText().toString());
FiscalFrequency ff = new FiscalFrequency();
revisedAmount = ff.alterForFrequency(enteredAmount, spinnerPosition);
return revisedAmount;
}
}
答案 0 :(得分:4)
getDefaultSharedPreferences(Context)接受Context实例(正如它所说),并且您提供的内容不是上下文。 如果您的FiscalFrequency类位于activity中且不是静态的,请尝试调用
getDefaultSharedPreferences(UserPrefs.this)
或者您当前正在进行的任何活动(因为活动扩展了上下文)
否则,在创建FiscalFrequency类的实例时提供Context实例。 一种方法是通过构造函数来完成。
P.S。如果你发布一部分代码,在那里你创建一个FiscalFrequency实例和活动发生的地方会更容易。
编辑: 在您的FiscalFrequency类中,执行以下操作:
public class FiscalFrequency {
public FiscalFrequency(final Context context) {
this.context = context;
}
private Context context;
... the rest of your class ...
}
然后,只有在为其提供上下文时才能创建FiscalFrequency的实例。
FiscalFrequency ff = new FiscalFrequency(this);
(“this”是对我们当前所在类的引用,在您的情况下,该类是Activity,而Activity是一个Context。
最后,在你的alterForFrequency()中执行:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
“context”是对Context(您的活动类)的引用,是您在创建FiscalFrequency实例时提供的。
答案 1 :(得分:1)
尝试在UserPrefs类的onCreate方法底部添加一个侦听器:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.registerOnSharedPreferenceChangeListener(this);
这将导致在用户更改值时动态更改首选项。