java – 我无法弄清楚如何使用Android PreferenceActivity

我一直在尝试使用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(作为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;
    }
}

解决方法:

getDefaultSharedPreferences(Context)接受Context实例(正如它所说),而你提供的不是上下文.
如果您的FiscalFrequency类位于activity中且不是静态的,请尝试调用

getDefaultSharedPreferences(UserPrefs.this)

或者您当前的任何活动(因为活动扩展了上下文)

否则,在创建FiscalFrequency类的实例时提供Context实例.
一种方法是通过构造函数来完成它.

附:如果你发布一部分代码,在那里你创建一个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”是您在创建FiscalFrequency实例时提供的Context(您的活动类)的引用.

上一篇:mathty7.3破解版安装地址及教程


下一篇:android – 处理JSON对象的最佳方法是什么?