2016-11-08 86 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