2011-06-18 44 views
10

我已經使EditTextPreference'textPasscode'依賴於CheckBoxPreference'checkBoxPasscode'。我希望'textPasscode'在用戶選中複選框後立即打開。是否有可能? 如果是這樣,我可以在onSharedPreferenceChanged()函數中使用什麼?通過代碼打開EditTextPreference(編程)

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
     if(key.contentEquals("checkBoxPasscode")){ 
       // ----some method to open edit text "textPasscode" ?? 
      } 
} 

感謝名單

回答

12

這個問題對我來說非常煩人,所以在實施Sandor建議之後,我在Android Reference中尋找了更好的解決方案,並且看看我找到了什麼。
EditTextPreference繼承自DialogPreference並且此類具有showDialog方法,所以我使用show方法從EditTextPreference創建了一個新類,它的工作原理類似於charme。

下面是一些代碼:

public class MyEditTextPref extends EditTextPreference { 
    //...constructor here.... 

    public void show() { 
     showDialog(null); 
    } 
} 

在我的settings.xml(至極我用來生成ActivitySettings佈局)我已經添加myEditTextPref

<package.that.contains.MyEditTextPreferences 
    android:key="myPref" 
    android:title="@string/pref_title" 
    android:summary="@string/pref_summary" 
    android:dialogTitle="@string/dialog_title" 
    android:dialogMessage="@string/dialog_message" 
/> 

我做的最後一件事是PreferenceAct中的onSharedPreferenceChanged方法ivity

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    if (key.equalsIgnoreCase(MY_CHECK_BOX)) { 
     MyEditTextPreferences myPref = (MyEditTextPreferences) findPreference("myPref"); 
     myPref.show(); 
    } 
} 

PS:其實我沒有使用PreferenceFragment因爲我想蜂窩預兼容性,但我不認爲這代碼太大變化。

+1

有史以來最好的答案:)感謝很多:) – cV2

+0

我得到一個'BadTokenException:無法添加窗口'stacktrace有時。任何想法爲什麼? – theblang

+0

當我離開PreferenceActivity然後返回時似乎會發生。我想''context'可能會有什麼事情呢? – theblang

4

我遇到了同樣的問題。 我不知道這是不是一個普遍的問題,有這麼少的搜索結果在網絡上。

似乎無法從代碼手動顯示EditTextPreference,雖然有一個明顯的解決方法。

通過創建警報對話框並處理OK按鈕的onclickevent,可以實現相同的外觀和行爲。

這是一個文本輸入對話框簡單的通用代碼:

public static EditText showInputDialog(Context context, OnClickListener clickListener, String message) 
{ 
    LayoutInflater factory = LayoutInflater.from(context); 
    final View textEntryView = factory.inflate(R.layout.dialogedittext, null);    
    final EditText editText = (EditText)textEntryView.findViewById(id.dialogEditText); 
    final AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder  
    .setTitle(message) 
    .setView(textEntryView) 
    .setPositiveButton("OK", clickListener) 
    .setNegativeButton("Cancel", null).show(); 
    return editText; 
} 

只是傳遞一個OnClickListener和處理偏好設置那裏。 不要忘記設置一個EditText變量來接收用戶輸入的輸入字符串。

我希望這有助於節省一些搜索此問題的人。

+0

非常感謝。這絕對有助於 –