我已經閱讀了一些關於這個問題的問題,但是我並不滿意答案,所以我決定詢問一下我的具體示例。從靜態環境中獲取資源
我正在開發和Android應用程序,它具有帶有幾個可配置整數參數的「設置」屏幕。所有這些參數都有最大值和最小值。因此,每次用戶爲這些參數設置一個新值時,我都想驗證它們。如果新值超出了定義的範圍,我想顯示一個Toast,通知用戶出了什麼問題。
另一方面,因爲在我的應用程序中的某些情況下,用戶可以「垃圾」一個可能顯示吐司的按鈕,爲了避免吐司顯示一段時間,我創建了一個靜態的應用程序類所顯示吐司,每次我想顯示乾杯:
public class MyApplication extends Application {
private static Toast toast;
public static void showToast(Context context, String string){
//(...)
}
}
回到設置頁,這裏是我是如何實現它:
public class SettingsActivity extends PreferenceActivity {
private Context context;
static SharedPreferences sharedPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}
public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
setListeners();
}
public void setListeners() {
setListenerA();
//(other listeners to other settings)
}
private void setListenerA() {
findPreference(KEY_PREF_A).setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean isEmpty = newValue.toString().isEmpty();
//(other validations)
boolean isValid = !isEmpty; //&& (other validations)
if(!isValid){
if(isEmpty){
MyApplication.showToast(context, MyApplication.getResources().getString(R.string.toastPreferenceNullValue));
} else if(isAnotherReasonToFail1){
// another Toast
} // else if(other reasons to fail)
}
return isValid;
}
}
);
}
}
}
這裏是我的問題:MyApplication.getResources()
是一個非靜態方法,並且不能從靜態上下文中調用o f類SettingsFragment。 context
也不是靜態的(因爲它不應該是),也不能在那裏引用。
我需要顯示敬酒,否則用戶不會知道爲什麼他的設置沒有被應用。另一方面,我需要將錯誤消息存儲在strings.xml文件中,這不僅是因爲這是你的方式,而且也是爲了將來的多語言目的。
我不熟悉的片段是如何工作的,我所做的設置屏幕這樣讀了幾篇文章(如this one)和一些問題在這裏了。設置屏幕可能有不同的方法,可以讓我做我想做的事,我只是不知道。
有人可以提出一種適合我的問題的方法嗎?
感謝
編輯:emerssso解決了資源的一部分。現在問題只是如何在沒有上下文的情況下調用Toast。
「現在的問題只是如何調用敬酒,而不必一個背景」 - 你有一個'Context',通過'getActivity()'。 – CommonsWare