2011-06-29 32 views
3

我正在爲Android應用程序創建一些自定義首選項。保存在Preference.onSaveInstanceState中的內容

我要創建的兩個是SeekBarPreferenceMultiSelectPreference

SeekBarPreference非常簡單,它繼承自DialogPreference並具有自定義內容視圖,其中它顯示SeekBar

MultiSelectPreference更高級一點,它打開Dialog點擊時有一個自定義ListView和一個按鈕。當按下該按鈕時,另一個Dialog被打開,其具有通用的ListView

對於這些偏好,我應該在onSaveInstanceState()中保存些什麼?
對於SeekBarPreference我假設我需要保存值,如果isPersistant()是假的,也是當前的滑塊進度(所以我可以恢復),但瀏覽後的Android源代碼似乎並不像EditTextPreference關心存儲它的當前文本,只有保存的值。

然而,DialogPreference保存對話框的當前狀態,但它似乎並沒有爲它的孩子保存狀態,但很難說,當我到達什麼時候我會失去什麼由於它是抽象的,我沒有找到任何子類,因此調用了onSaveInstanceState

任何有關此問題的見解都將不勝感激,我的目標是稍後開放源代碼,所以我希望這樣做。

回答

2

大量的測試和代碼瀏覽後這些都是我的結論:

  • 當根視圖讓你不需要保存的視圖狀態,如果它們連接到根視圖,因爲它們被保存保存,在我的情況下,這意味着我不必保存SeekBar的狀態,這是當超級類保存對話框時的句柄。
  • 如果您沒有持久性,您應該始終保存您的值
  • 您應該保存所有在創建首選項後更改/可以更改的實例變量,這意味着可以使用setter更改或可以更改的變量時間。

即使後面沒有谷歌他們的最後一點自我,他們是錯誤的,一個簡單的例子說明了爲什麼: 假設你有一個包含兩件事情PreferenceActivity;一個ListPreference包含10個項目和一個通用首選項,當按下時將項目添加到ListPreference的末尾。

現在想象用戶啓動應用程序並按通用首選項,ListPreference現在有11個項目。 用戶現在打開ListPreference。

如果應用程序關閉然後殺死實例被保存,但ListView只保存存儲的值(如果它不是持久的),所以當它重新打開時它只包含最初的10個項目。

下面是一個顯示問題的簡單應用程序的例子,只需點擊按鈕,打開列表(應該有4個項目),打開列表關閉應用程序,從adb中關閉應用程序並重新打開它,該列表現在有三個項目。

PreferenceTest.java

package com.example; 

import java.util.ArrayList; 
import java.util.Arrays; 

import android.os.Bundle; 
import android.preference.ListPreference; 
import android.preference.Preference; 
import android.preference.Preference.OnPreferenceClickListener; 
import android.preference.PreferenceActivity; 

public class PreferenceTest extends PreferenceActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     getPreferenceScreen().findPreference("button").setOnPreferenceClickListener(new OnPreferenceClickListener() { 

      @Override 
      public boolean onPreferenceClick(Preference preference) { 
       ListPreference lp = (ListPreference) getPreferenceScreen().findPreference("list"); 

       ArrayList<CharSequence> al = new ArrayList<CharSequence>(Arrays.asList(lp.getEntries())); 
       CharSequence items[] = new CharSequence[al.size()+1]; 
       al.add("Item " + items.length); 
       lp.setEntries(al.toArray(items)); 

       al = new ArrayList<CharSequence>(Arrays.asList(lp.getEntryValues())); 
       al.add("Value " + items.length); 
       lp.setEntryValues(al.toArray(items)); 

       return true; 
      } 
     }); 
    } 
} 

RES/XML /的preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <ListPreference 
    android:key="list" 
    android:entries="@array/list_entries" 
    android:entryValues="@array/list_values" 
    android:title="Example list" 
    android:summary="This list contains 3 items by default" />  

    <Preference 
    android:key="button" 
    android:title="Example button" 
    android:summary="When clicked this adds an item to the list" /> 

</PreferenceScreen> 

RES /值/ list_items.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="list_entries"> 
     <item>Item 1</item> 
     <item>Item 2</item> 
     <item>Item 3</item> 
    </string-array> 

    <string-array name="list_values"> 
     <item>Value 1</item> 
     <item>Value 2</item> 
     <item>Value 3</item> 
    </string-array> 
</resources>