4

Android 設定アクティビティを使用しようとしましたが、すべて設定しましたが、ユーザーの設定を実際に取得するのに問題があります。具体的には、期間の長さと年の長さの 2 つの 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;
    }
}
4

2 に答える 2

4

getDefaultSharedPreferences(Context) は Context インスタンスを取り (それが言うように)、提供しているものはコンテキストではありません。FiscalFrequency クラスがアクティビティにあり、静的でない場合は、呼び出してみてください

getDefaultSharedPreferences(UserPrefs.this)

または、現在行っているアクティビティ (Activity は Context を拡張するため)

それ以外の場合は、FiscalFrequency クラスのインスタンスを作成するときに Context インスタンスを指定します。1 つの方法は、コンストラクターを使用して行うことです。

PSコードの一部を投稿すると、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);

(「これ」は現在いるクラスへの参照であり、あなたの場合のそのクラスはアクティビティであり、アクティビティはコンテキストです。

そして最後に、alterForFrequency() で次のようにします。

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

「context」は、FiscalFrequency のインスタンスを作成したときに指定した Context (この場合はアクティビティ クラス) への参照です。

于 2011-01-26T12:09:57.977 に答える
1

UserPrefs クラスの onCreate メソッドの下部にリスナーを追加してみてください。

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

これにより、ユーザーが値を変更すると、その場で設定が変更されます。

于 2011-01-26T12:18:21.653 に答える