java - 我不知道如何使用 android PreferenceActivity

标签 java android preferences preferenceactivity

我一直在尝试使用 android 首选项 Activity ,我已经设置好了所有内容,但实际上在检索用户首选项时遇到了问题。具体来说,它是两个 edittext 首选项,术语长度和年份长度,我想检索 int 的值,以便我可以在另一个 Activity 的计算中使用它们。

我找到的每个例子都不一样,我真的找不到明确的解释。我将在下面发布我正在使用的类和方法,我知道那里的代码不正确,但我觉得我现在已经以各种方式搞砸了它并且无法弄清楚。特别是我认为这一行是不正确的:SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 我并不真正理解整个偏好 Activity ,它们似乎并不像我希望。任何建议真的很棒!几天来我一直在处理相同的代码行。
谢谢。

我的偏好 Activity 如下所示:

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 的 Activity 中使用 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)

或者你当前正在进行的任何 Activity (因为 Activity extends Context)

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

附言如果您发布部分代码会更容易,您可以在其中创建 FiscalFrequency 的实例和它发生的 Activity 。

编辑: 在您的 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 是一个上下文。

最后,在您的 alterForFrequency() 中执行:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

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

关于java - 我不知道如何使用 android PreferenceActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4803563/

相关文章:

android - 如何打开上次使用的首选项屏幕?

android - android 设置中的首选项变灰

android - 管理多个 SharedPreference 文件

java - 在 Nutch 源代码中启动 Solr 索引

java - Java中的静态final方法

android - 通过全局变量通信服务和Activity

android - 验证在 RxJava Subscriber 的 onNext 中调用了方法

Java类对象和类Class

java - 从 Google Vision API 获取空响应

android - 适用于 Android 客户管理器的 Cordova 插件(版本 > 3)