2

我試圖阻止用戶輸入一個空字符串轉換爲EditTextPreference(在本例中,catName)沒有更新。我用一個OnPreferenceChangeListener當變化到EditTextPreference做檢測,如果有變化和字符串是空白,我用EditTextPreference.setText()命令重置舊值。但是,如果我在GUI中重新打開EditTextPreference(該字符串爲空),則新值不會正確顯示,如果我回到主應用程序,我可以驗證是否將空白值保存到首選項。EditTextPreference.setText(值)如預期

我驗證過if語句按預期執行,並如預期我的舊名稱(oldCatName)的參數保持跟蹤正在更新。我甚至可以在setOnPreferenceChangeListener執行完畢之前登錄的catName.getText()值正確的,我總能看到我所期望的價值(由用戶設定的新的價值,當他們進入一個空白的值,它正確地重置舊值)。我不知道爲什麼將值設置爲EditTextPreference未將值保存到首選項文件或更新GUI。

public class SettingsActivity extends PreferenceActivity { 

    private String oldCatName; 
    private EditTextPreference catName; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     addPreferencesFromResource(R.xml.settings); 

     catName = (EditTextPreference) findPreference("cat_name"); 
     oldCatName = catName.getText(); 

     catName.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
      @Override 
      public boolean onPreferenceChange(Preference preference, Object newVal) { 
       final String value = (String) newVal; 
       if (value.equals("")) { 
        catName.setText(oldCatName);     
        Log.e("new value", catName.getText()); 
       } 
       else 
        oldCatName = value; 
       return true; 
      } 
     }); 
    } 
} 

感謝您的幫助! -Michael

編輯:澄清。 if語句中的邏輯正確執行。 EditTextPreference的字符串值甚至可以正確更新。但是,如果用戶再次點擊EditTextPreference,GUI中的值不會正確更新,並且應用程序共享首選項中的值不會正確更新。它保持空白。

+0

如果(value.equals( 「」)|| value.equals(空)) –

+0

我給它一個嘗試,但遺憾的是沒有運氣。我相當確信這個問題不在意外執行的if語句中,而是用我的方法來編輯值。 –

+0

什麼是'newVal'?它是「EditText」嗎? –

回答

4

終於找到了解決方案通過執行以下操作:

  • 我用SharedPreferences.OnSharedPreferenceChangeListener代替Preference.OnPreferenceChangeListenerPreference.OnPreferenceChangeListener會查找用戶何時通過設置菜單更改首選項,並在更改提交給首選項數據之前執行操作。 SharedPreferences.OnSharedPreferenceChangeListener監聽對實際首選項數據的更改,而不是GUI中的更改,因此稍後會發生。我注意到,在我第一次嘗試,我可以運行setText()緊接着getText()EditTextPreference對象上,而getText()值將不匹配我有setText()值正好被設置爲。我不知道爲什麼發生這種情況,但在嘗試運行setText()之前等待實際提交的更改導致了正確的響應。也許這是一個時間問題?

  • 在更新EditTextPreference中的值後,我運行setPreferenceScreen(null)addPreferencesFromResource(R.xml.settings)。如果我沒有這樣做,有時當用戶再次點擊EditTextPreference時,即使設置文件中的值不是,字段中的值也會顯示爲空白。這迫使設置頁面或多或少地刷新自身。

工作代碼如下:

public class SettingsActivity extends PreferenceActivity { 

    private String oldCatName; 
    private EditTextPreference catName; 
    private SharedPreferences.OnSharedPreferenceChangeListener listener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.settings); 
     createListener(); 
     catName = (EditTextPreference) findPreference("cat_name"); 
     oldCatName = catName.getText(); 
    } 

    private void createListener() { 
     listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
      @Override 
      public void onSharedPreferenceChanged(
        SharedPreferences sharedPreferences, String key) { 
       String value = sharedPreferences.getString("cat_name", "NULL"); 
       if (value.equals("")) { 
        catName.setText(oldCatName); 
        setPreferenceScreen(null); 
        addPreferencesFromResource(R.xml.settings); 
       } else { 
        oldCatName = value; 
       } 
      } 
     }; 
     PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) 
      .registerOnSharedPreferenceChangeListener(listener); 
    } 
} 
+0

我不確定'getString(「cat_name」,「NULL」);' - 你想達到什麼目的?還要注意,當'createListener'運行'oldCatName'時爲空。底線 - 你需要'setPreferenceScreen(null);'?我使用相同的方法,但不這麼認爲,但我必須確定 –

+0

請注意,如果在addPreferencesFromResource(R.xml.settings)之後執行更多操作(例如添加偵聽器,設置ui方面等),她應該在這個調用(或將它們移到一個方法中) – denispyr