如何填充ListPreference進入和entryvalues從onPreferenceClick事件的Android ListPreference填寫項目onPreferenceClick事件
我填寫從onPreferenceClick事件,但是當首次點擊獲取空列表 當第二個被點擊的是讓所有的物品。
爲什麼當第一次克隆然後獲得空列表?
謝謝。
如何填充ListPreference進入和entryvalues從onPreferenceClick事件的Android ListPreference填寫項目onPreferenceClick事件
我填寫從onPreferenceClick事件,但是當首次點擊獲取空列表 當第二個被點擊的是讓所有的物品。
爲什麼當第一次克隆然後獲得空列表?
謝謝。
第一個想法出現在我腦海裏。看起來像一個非常骯髒的黑客要繞過,但無論如何:
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;
}
});
當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"});
}
};
}
謝謝 - 我認爲這應該被標記爲正確的解決方案 - 亞歷克斯奧爾洛夫的解決方案是非常「哈克」,並導致問題,如果喜好按類別組織。 – 2017-04-05 15:58:43
還有爲三個ListPreference在偏好設置屏幕。 我的ListPreference是second.But點擊第二個ListPreference打開第一個ListPreference。爲什麼? – david 2011-05-27 09:22:06
我的ListPrefernce位置3但lpFiyat.getOrder()獲取位置2 爲什麼? – david 2011-05-27 09:27:35
嘗試將新的Runnable更改爲某些特定實現,您將在其中專門提供首選項。因爲我沒有工作代碼,所以在這個階段我無法幫到你。 – 2011-05-27 09:44:37