Androidの好みを使用する方法がわかりません
-
24-10-2019 - |
質問
Androidの好みのアクティビティを使用しようとしていますが、すべてセットアップしましたが、実際にユーザーの好みを取得するのに苦労しています。具体的には、任期の長さと年の長さの2つのEdittextの好みであり、ASの値を取得して、別のアクティビティの計算でそれらを使用できるようにします。
私が見つけたすべての例は異なり、私は本当に明確な説明を見つけることができません。以下で使用しているクラスとメソッドを投稿します。正しいコードが正しくないことは知っていますが、今はどこでもそれを台無しにして、それを理解できないように感じます。特にこの行は正しいとは思わない: 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());
}
}
そして、この方法では、ユーザーのタームリングと年長(intsとして)を取得できるようにしたいと思います。
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;
}
}
解決
getDefaultSharedPreferences(コンテキスト)は、コンテキストインスタンス(言うように)を取り入れており、あなたが提供しているのはコンテキストではありません。 Fiscalfrequencyクラスがアクティビティに位置し、静的でない場合は、呼び出しを試してみてください
getDefaultSharedPreferences(UserPrefs.this)
または現在のアクティビティが現在あります(アクティビティはコンテキストが拡張されるため)
それ以外の場合は、財政周波数クラスのインスタンスを作成するときにコンテキストインスタンスを提供します。 1つの方法は、コンストラクターを介してそれを行うことです。
PSは、コードの一部を投稿すると簡単になります。この場合、財政のインスタンスとアクティビティのインスタンスが発生します。
編集:Fiscalfrequencyクラスで次のことを行います。
public class FiscalFrequency {
public FiscalFrequency(final Context context) {
this.context = context;
}
private Context context;
... the rest of your class ...
}
そして、あなたはそれに文脈を提供するときにのみ、あなたの財政のインスタンスを作成することができます。
FiscalFrequency ff = new FiscalFrequency(this);
(「これ」は私たちが現在いるクラスへの参照であり、あなたの場合のクラスは活動であり、活動はコンテキストです。
そして最後に、alterforfrequency()では次のことを行います。
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
「コンテキスト」は、財政のインスタンスを作成したときに提供したコンテキスト(あなたの場合のアクティビティクラス)への参照です。
他のヒント
userPrefsクラスのOnCreateメソッドの下部にリスナーを追加してみてください。
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.registerOnSharedPreferenceChangeListener(this);
これにより、ユーザーが値を変更すると、その場で設定が変更されます。