Android ListPreference在PreferenceClick事件上填充项

Android ListPreference在PreferenceClick事件上填充项,android,listpreference,Android,Listpreference,如何从onPreferenceClick事件填充ListPreference条目和EntryValue 我从onPreferenceClick事件中填写,但第一次单击获取空列表时 当第二次单击时,将获取所有项目 为什么第一次点击后得到的是空列表 谢谢。我第一个想到的主意。看起来像是一个非常肮脏的黑客,但无论如何: findPreference("yourPreferenceKey").setOnPreferenceClickListener(new OnPreferenceClickListen

如何从onPreferenceClick事件填充ListPreference条目和EntryValue

我从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>

首选项屏幕上有三个ListPreference。我的ListPreference是第二个。但单击第二个ListPreference会打开第一个ListPreference。为什么?我的ListPreference位置3,但lpFiyat.getOrder()获得位置2为什么?请尝试将new Runnable更改为某些特定的实现,您将在其中专门提供首选项。在那个阶段我真的帮不了忙,因为我没有一个有效的代码。谢谢-我认为这一个应该被标记为正确的解决方案-Alex Orlov的解决方案非常“黑”,如果偏好按类别组织,就会导致问题。
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"});
        }
    };

}