2016-11-08 85 views
0

我已经阅读了一些关于这个问题的问题,但是我并不满意答案,所以我决定询问一下我的具体示例。从静态环境中获取资源

我正在开发和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。

+0

“现在的问题只是如何调用敬酒,而不必一个背景” - 你有一个'Context',通过'getActivity()'。 – CommonsWare

回答

4

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

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

更一般地,getActivity()可以用来获得每当片段被附接到活动的有效上下文,如ActivityContext一个实现。

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

+0

谢谢!这解决了它的一部分! 但我仍然无法参考上下文(我编辑了我的问题),因为上下文不能是静态的。 –

+0

更新了答案,使其更具一般性。 – emerssso

+0

它在销毁后不会持有对该活动的引用会导致内存泄漏? – BlackHatSamurai