从静态上下文获取资源

Mar*_*nho 0 android android-context android-resources

我已经读过几个关于此的问题,但我对答案不满意,所以我决定问一下我的具体例子.

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

另一方面,因为在我的应用程序的某些情况下,用户可以"垃圾"一个可能显示Toast的按钮,为了避免Toast显示重复一段时间,我创建了一个带有静态Toast的Application类,每次我想要祝酒:

public class MyApplication extends Application {
    private static Toast toast;
    public static void showToast(Context context, String string){
       //(...)
    }
}
Run Code Online (Sandbox Code Playgroud)

回到"设置"页面,这是我实现它的方式:

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;
                    }
                }
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的问题:MyApplication.getResources()是一个非静态方法,无法从类SettingsFragment的静态上下文中调用.另外context是不是静态的(因为它不应该是),并不能同时存在引用.

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

我不熟悉Fragments的工作方式,在阅读了几篇文章(如本文)和一些问题后,我就像这样设置了"设置"界面.可能有一种不同的方式来设置允许我做我想要的设置屏幕,我只是不知道.

有人可以建议一种适合我的问题的方法吗?

谢谢

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

eme*_*sso 5

Fragment有一个getResources()等同于调用的方法Application::getResources().唯一需要注意的是,您必须确保片段附加到活动(即getActivity() != null),否则您可能会抛出异常.

请参阅:https://developer.android.com/reference/android/app/Fragment.html#getResources()

更一般地说,getActivity()只要片段附加到活动,就可以用来获得有效的上下文,就像Activity它的实现一样Context.

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