2011-05-27 105 views

回答

3

第一個想法出現在我腦海裏。看起來像一個非常骯髒的黑客要繞過,但無論如何:

findPreference("yourPreferenceKey").setOnPreferenceClickListener(new OnPreferenceClickListener() { 

     private final String[] values = {"1","2","3","4"}; // Data set (as an example) 

     @Override 
     public boolean onPreferenceClick(final Preference preference) { 
      ((ListPreference)preference).setEntryValues(values); // Set new values 
      ((ListPreference)preference).setEntries(values); // And new keys 
      final OnPreferenceClickListener prefClickListener = this; // Store the reference to this click listener for a later use 
      preference.setOnPreferenceClickListener(null); // And remove it from current preference, so it won't cause a recursion when we will emulate user click later 
      YourPreferenceActivity.this.runOnUiThread(new Runnable(){ // Do some work after current listener finishes it's stuff 
       @Override 
       public void run() { 
        ((ListPreference)preference).getDialog().dismiss(); // Dismiss the dialog that popped up because of our first click (with the old data) 
        YourPreferenceActivity.this.getPreferenceScreen().onItemClick(null, null, preference.getOrder(), 0); // Emulate user click. System will think that user clicked on the same preference again 
        preference.setOnPreferenceClickListener(prefClickListener); // Let's return our click listener back, so the whole operation will repeat on the next click (delete thi sline if you need preloading only once. 
       } 

      }); 
      return false; 
     } 
    }); 
+0

還有爲三個ListPreference在偏好設置屏幕。 我的ListPreference是second.But點擊第二個ListPreference打開第一個ListPreference。爲什麼? – david 2011-05-27 09:22:06

+0

我的ListPrefernce位置3但lpFiyat.getOrder()獲取位置2 爲什麼? – david 2011-05-27 09:27:35

+0

嘗試將新的Runnable更改爲某些特定實現,您將在其中專門提供首選項。因爲我沒有工作代碼,所以在這個階段我無法幫到你。 – 2011-05-27 09:44:37

4

當setOnPreferenceClickListener被調用時,對話似乎已經創建。一個可能的解決方案是擴展ListPreference並攔截點擊視圖。

package com.example; 

import android.preference.ListPreference; 
import android.content.Context; 
import android.util.AttributeSet; 

public class DynamicListPreference extends ListPreference { 
    public interface DynamicListPreferenceOnClickListener { 
     public void onClick(DynamicListPreference preference); 
    } 

    private DynamicListPreferenceOnClickListener mOnClicListner; 

    public DynamicListPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void onClick(){ 
     if (mOnClicListner != null) 
      mOnClicListner.onClick(this); 
     super.onClick(); 
    } 

    public void setOnClickListner(DynamicListPreferenceOnClickListener l) { 
     mOnClicListner = l; 
    } 

} 

新類具有公共方法setOnClickListner,你應該用它代替setOnPreferenceClickListener的。

然後你就可以在你的XML文件的偏好使用DynamicListPreference

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 
     <com.example.DynamicListPreference 
      android:key="id_list" 
      android:title="@string/opt_label" 
     /> 
</PreferenceScreen> 

在你PreferenceActiviy:

package com.example; 

import com.example.DynamicListPreference.DynamicListPreferenceOnClickListener; 

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

public class MyPreferencesActivity extends PreferenceActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
     DynamicListPreference pref = (DynamicListPreference)findPreference("id_list"); 
     pref.setOnClickListner(onClickListener_mylist); 
    } 

    private DynamicListPreferenceOnClickListener onClickListener_mylist = new DynamicListPreferenceOnClickListener() { 
     @Override 
     public void onClick(DynamicListPreference preference) { 
      ListPreference pref = (ListPreference) preference; 
      pref.setEntryValues(new String[] {"1", "2"}); 
      pref.setEntries(new String[] {"first", "second"}); 
     } 
    }; 

} 
+0

謝謝 - 我認爲這應該被標記爲正確的解決方案 - 亞歷克斯奧爾洛夫的解決方案是非常「哈克」,並導致問題,如果喜好按類別組織。 – 2017-04-05 15:58:43