Android 从静态上下文获取资源

Android 从静态上下文获取资源,android,android-resources,android-context,Android,Android Resources,Android Context,我已经读了一些关于这个的问题,但是我对答案不满意,所以我决定询问我的具体例子 我正在开发一款Android应用程序,它有一个带有一些可配置整数参数的设置屏幕。所有这些参数都有一个最大值和最小值。因此,每当用户为这些参数设置一个新值时,我都想验证它们。如果新值超出定义的界限,我想显示一个Toast,通知用户出了什么问题 另一方面,因为在我的应用程序中的某些情况下,用户可以“垃圾邮件”一个可能显示Toast的按钮,为了避免Toast在一段时间内重复显示,我创建了一个应用程序类,其中包含一个静态Toa

我已经读了一些关于这个的问题,但是我对答案不满意,所以我决定询问我的具体例子

我正在开发一款Android应用程序,它有一个带有一些可配置整数参数的设置屏幕。所有这些参数都有一个最大值和最小值。因此,每当用户为这些参数设置一个新值时,我都想验证它们。如果新值超出定义的界限,我想显示一个Toast,通知用户出了什么问题

另一方面,因为在我的应用程序中的某些情况下,用户可以“垃圾邮件”一个可能显示Toast的按钮,为了避免Toast在一段时间内重复显示,我创建了一个应用程序类,其中包含一个静态Toast,每当我想显示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()
是一个非静态方法,不能从类setingsFragment的静态上下文调用。此外,
上下文
不是静态的(因为它不应该是静态的),也不能在那里引用

我需要显示Toast,因为否则用户不会知道为什么他的设置没有被应用。另一方面,我需要将错误消息存储在strings.xml文件中,这不仅是因为您是这样做的,而且是为了将来的多语言目的

我不熟悉片段是如何工作的,在阅读了一些文章(比如)和一些问题之后,我做了如下设置屏幕。可能有一种不同的方式来制作一个设置屏幕,允许我做我想做的事情,我只是不知道

有人能提出一个适合我问题的方法吗

谢谢


编辑:Emersso解决了资源部分。现在的问题只是如何在没有上下文的情况下调用Toast。

片段有一个
getResources()
方法,该方法相当于调用
Application::getResources()
。唯一需要注意的是,您必须确保片段已附加到某个活动(即
getActivity()!=null
),否则可能引发异常

见:

更一般地说,
getActivity()
可以用于在片段附加到活动时获取有效的上下文,因为
activity
context
的实现


如果您希望在片段分离后仍具有上下文引用,则可以在片段中安全地存储对
getActivity().getApplicationContext()
的引用以供以后使用,但这可能并不理想。

片段具有一个
getResources()
方法,该方法相当于调用
Application::getResources()
。唯一需要注意的是,您必须确保片段已附加到某个活动(即
getActivity()!=null
),否则可能引发异常

见:

更一般地说,
getActivity()
可以用于在片段附加到活动时获取有效的上下文,因为
activity
context
的实现


如果您希望在片段分离后仍具有上下文引用,则可以在片段中安全地存储对
getActivity().getApplicationContext()
的引用,以供以后使用,但这可能并不理想。

谢谢!这解决了部分问题!但我仍然无法引用其中的上下文(我已经编辑了我的问题),因为上下文不能是静态的。更新了答案,使其更一般。在活动被破坏后保留对该活动的引用不会导致内存泄漏吗?是的,这就是为什么我建议保留对
getActivity().getApplicationContext()
的引用。应用程序上下文在应用程序的生命周期内有效,不会导致引用泄漏(与Acitivity不同,您正确地指出,Acitivity是一个巨大的禁忌)。谢谢!这似乎解决了我所有的问题(现在)!我感谢你的帮助!谢谢这解决了部分问题!但我仍然无法引用其中的上下文(我已经编辑了我的问题),因为上下文不能是静态的。更新了答案,使其更一般。在活动被破坏后保留对该活动的引用不会导致内存泄漏吗?是的,这就是为什么我建议保留对
getActivity().getApplicationContext()
的引用。应用程序上下文在应用程序的生命周期内有效,不会导致引用泄漏(与Acitivity不同,您正确地指出,Acitivity是一个巨大的禁忌)。谢谢!这似乎解决了我所有的问题(现在)!我感谢你的帮助!“现在的问题只是如何在没有上下文的情况下调用Toast”--通过
getActivity()
,您有一个
context
“现在的问题只是如何在没有上下文的情况下调用Toast”--通过
getActivity()
,您有一个
context