Java 我能';我不知道如何使用android PreferenceActivity

Java 我能';我不知道如何使用android PreferenceActivity,java,android,preferences,preferenceactivity,Java,Android,Preferences,Preferenceactivity,我一直在尝试使用安卓偏好活动,我已经全部设置好了,但是我在检索用户偏好时遇到了困难。具体来说,有两个edittext首选项,term length和year length,我希望检索as int的值,以便在另一个活动的计算中使用它们 我发现的每个例子都不一样,我真的找不到一个清楚的解释。我将在下面发布我正在使用的类和方法,我知道那里的代码是不正确的,但我觉得我现在已经把它弄得乱七八糟,弄不清楚了。我尤其不相信这一行是正确的:SharedReferences prefs=PreferenceMan

我一直在尝试使用安卓偏好活动,我已经全部设置好了,但是我在检索用户偏好时遇到了困难。具体来说,有两个edittext首选项,term length和year length,我希望检索as int的值,以便在另一个活动的计算中使用它们

我发现的每个例子都不一样,我真的找不到一个清楚的解释。我将在下面发布我正在使用的类和方法,我知道那里的代码是不正确的,但我觉得我现在已经把它弄得乱七八糟,弄不清楚了。我尤其不相信这一行是正确的:
SharedReferences prefs=PreferenceManager.getDefaultSharedReferences(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(作为int):

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

GetDefaultSharedReferences(上下文)接受上下文实例(如它所说),您提供的不是上下文。 如果您的FiscalFrequency类位于活动中且不是静态的,请尝试调用

getDefaultSharedPreferences(UserPrefs.this)
或者您当前所在的任何活动(因为活动扩展了上下文)

否则,请在创建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”是对我们当前所在的类的引用,在您的案例中,该类是活动,活动是上下文

最后,在alterForFrequency()中执行以下操作:


“context”是对context(在您的案例中是您的活动类)的引用,是您在创建FiscalFrequency实例时提供的。

尝试在UserPrefs类的onCreate方法底部添加侦听器:

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

这将导致在用户更改值时动态更改首选项。

从pref读取首选项后发生的问题或错误是什么?@Janusz:根据上面设置的代码,我在
SharedReferences Prefs=…
行中得到此错误:方法GetDefaultSharedReferences(上下文)在类型PreferenceManager中,不适用于参数(FiscalFrequency)。此外,由于某些原因,用于获取xml editText键的方法getString未定义。如果我对(通过将所有内容放在UserPrefs中,并让我的另一个类扩展它以访问变量,我得到了NumberFormatException。我对所有这些都不熟悉,通常我会尝试使用断点来解决这个问题,但由于它似乎并没有真正运行创建代码时的首选项,我不知所措。我想我只是需要有人重新安排所有内容。)是的,但它可能更复杂,所以我很感谢你的帮助。对不起,你能进一步说明一下吗,我只是在学习,而且我对上下文的理解显然还很差:/我如何通过构造函数提供上下文?你也是对的!我将在上面的文章中使用alterForFrequency的部分代码。我实际上正在使用它在一个叫做“键盘”的活动中。谢谢你们,你们的回答非常有用:)
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.registerOnSharedPreferenceChangeListener(this);