2011-01-26 58 views
4

我一直在尝试使用android偏好活动,我已经完成了所有设置,但实际上检索用户首选项时遇到了问题。具体来说,它是两个edittext首选项,字段长度和年份长度,我想要检索as int的值,以便我可以在另一个活动的计算中使用它们。我不知道如何使用android偏好活动

我发现的每个例子都不一样,我也找不到明确的解释。我将在后面发布该类和我正在使用的方法,我知道那里的代码是不正确的,但我觉得我现在已经搞乱了它,并且无法弄清楚它。这条线特别是我不相信是正确的: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

在从pref中读取偏好之后发生了什么问题或错误? – Janusz 2011-01-26 10:43:14

+0

@Janusz:以及在上面设置的代码,我在`SharedPreferences Prefs = ..`行中得到了这个错误:类型PreferenceManager中的方法getDefaultSharedPreferences(Context)不适用于参数(FiscalFrequency)。还有getString方法来获取xml editText键,由于某种原因未定义。如果我把所有东西都打乱了(把所有东西都放在UserPrefs中,让我的其他类扩展它来访问变量,我得到一个NumberFormatException。 – Holly 2011-01-26 11:35:35

回答

4

getDefaultSharedPreferences(Context)需要在Context实例中(如上所述),并且您提供的内容不是上下文。 如果您FiscalFrequency类位于活动,也不是一成不变的,尝试调用

getDefaultSharedPreferences(UserPrefs.this) 

或者什么活动你是在目前(因为活动扩展上下文)

否则,供应语境例如,当你创建一个实例你的FiscalFrequency类。 一种方法是通过构造函数来完成。

P.S.如果你发布了一部分代码,那么你会更容易创建一个FiscalFrequency实例和活动。

编辑: 在你FiscalFrequency类做到以下几点:

public class FiscalFrequency { 
    public FiscalFrequency(final Context context) { 
     this.context = context; 
    } 
    private Context context; 
    ... the rest of your class ... 
} 

而且yhen你可以给它提供上下文,只有当创建FiscalFrequency的一个实例。

FiscalFrequency ff = new FiscalFrequency(this); 

(“本”是在课堂上,我们目前正处于一个参考,对你来说那类活动,而活动是上下文。

最后,在你的alterForFrequency()做:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 

“背景”是上下文(在你的情况下,您的活动类)的参考,您在创建FiscalFrequency的实例所提供。

1

尝试在用户偏好类的onCreate方法的底部添加监听:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
prefs.registerOnSharedPreferenceChangeListener(this); 

这将导致偏好来在飞行当用户改变的值被改变。