2011-01-26 18 views
4

アンドロイドの設定作業を使用しようとしていましたが、すべて設定しましたが、実際にユーザーの設定を取得するのに問題があります。具体的には、長さと年の長さという2つのedittextプリファレンスがあり、intの値を取得したいので、別のアクティビティの計算で使用できます。私はアンドロイドの使い方を理解できませんPreferenceActivity

私が見つけたすべての例は異なっており、私は本当に明確な説明を見つけることができません。私はクラスと私が下で使用しているメソッドを投稿しますが、私はそこに正しいコードがあることを知っていますが、私は今どのような方法でそれを把握し、それを把握することはできませんでした。このラインは、特に私が正しいと信じていない: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と、(int型など)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のインスタンスを作成して、キーパッドと呼ばれるアクティビティで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

+0

@Janusz:上で設定したコードで、 'SharedPreferences Prefs = ..'行にこのエラーが表示されます。型PreferenceManagerのgetDefaultSharedPreferences(Context)メソッドは、引数(FiscalFrequency)には適用されません。何らかの理由でxml editTextキーを取得するgetStringメソッドも定義されていません。私はUserPrefsにすべてを入れて、変数へのアクセスのために他のクラスを拡張してNumberFormatExceptionを取得すると、 – Holly

+0

私はこれを新しくし、通常はブレークポイントを使ってこの問題を解決しようとしますが、私はちょうどすべてを再配置する人が必要だと思うが、それはより複雑かもしれないので、助けに感謝する – Holly

答えて

4

getDefaultSharedPreferences(Context)はContextインスタンスを取り込みます。あなたが提供しているものはコンテキストではありません。あなたのFiscalFrequencyクラスが活動に位置し、静的ではありません 場合、どのような活動(アクティビティコンテキストが伸びるので)あなたが現在している

そうでない場合は、電源コンテキストインスタンスは、インスタンスを作成するときに

getDefaultSharedPreferences(UserPrefs.this) 

かを呼び出してみてくださいあなたのFiscalFrequencyクラスの 1つの方法はコンストラクタを使用して行います。

P.S. FiscalFrequencyとアクティビティのインスタンスを作成する場所のコードの一部を投稿すると簡単になります。

EDIT:あなたの 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のインスタンスを作成したときに指定したことを、コンテキスト(あなたのケースでは、あなたの活動クラス)への参照です。ユーザー設定クラスでのonCreateメソッドの底にリスナーを追加

+0

申し訳ありませんが、私はちょうど学び、コンテキストの私の理解は明らかにまだかなり貧しいです:/どのように私はコンストラクタを介してコンテキストを提供するでしょうか?また、あなたは正しいです!私は上記​​の私のポストをalterForFrequencyを使用してコードの部分で慰めるでしょう。 – Holly

+0

私は私の最初の答えを編集しました;) –

+0

ありがとう、あなたは答えが信じられないほど役に立ちました:) – Holly

1

試してみてください。

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

これは、ユーザーが値を変更したときの好みはその場で変更されることになります。

関連する問題