我已经阅读了一些关于这个问题的问题,但是我并不满意答案,所以我决定询问一下我的具体示例。从静态环境中获取资源
我正在开发和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