Android:阻止首选项的首选项对话框,必须通过网络加载

Noa*_*oah 2 android android-preferences

我的应用程序有一个ListPreference,其条目来自网络API.在我的PreferenceActivity的onCreate()中,我生成了一个后台线程,它进行API调用,然后在一两秒后填充ListPreference的条目.

如果用户在下载选项之前单击首选项屏幕上的ListPreference按钮,我想阻止显示首选项对话框,而是通知用户仍在加载选项列表.

我怀疑正确的方法是覆盖OnPreferenceClickListener,如下所示:

ListPreference dpref = (ListPreference) findPreference("debug");
String[] s = {"one", "two", "three"};
dpref.setEntries(s);
dpref.setEntryValues(s);
dpref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
        Toast.makeText(this, "hi there", Toast.LENGTH_SHORT).show();
        return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

将显示toast,但也会显示ListPreference选择器对话框.该OnPreferenceClickListener文件说,onPreferenceClick应该返回true如果点击被处理,但返回false具有相同的效果.

如何阻止首选项对话框显示?

是否有更好的方法来处理在查看之前必须下载选项的首选项?

Ger*_*ard 6

我遇到了同样的问题,但是在一个更简单的环境中.我的PreferenceScreen在xml文件中定义.我想要处理一个偏好.所以我只是将一个"Preference"对象放入xml文件而不是"ListPreference"或"EditTextPreference"

    <Preference android:title="@string/preloadmaps1" android:summary="@string/preloadmaps2"
        android:key="preloadMaps" />
Run Code Online (Sandbox Code Playgroud)

现在没有更多的编辑器与Preference相关联,我可以在"OnPreferenceClickListener"中自救地处理编辑


Jay*_*ker 5

关于showDialog参考android dveloper文件:

显示与此首选项关联的对话框.这通常是在单击首选项时自动启动的.如果需要在其他事件上显示对话框,请调用此方法.

因此,当click click将自动调用showDialog()时,如果要控制以防止在单击首选项上显示对话框,则需要实现自定义首选项,如下所示,

public class MyPreference extends ListPreference {
    private Context context;

    // a flag to control show dialog
    private boolean showDialog = false;

    public MyPreference(Context context) {
        super(context);
        this.context = context;
    }

    public MyPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;       
    }

    @Override
    protected void showDialog(Bundle state) {        
        if (showDialog) {
            // show dialog 
            super.showDialog(state);
        } else {
            // if you don't want to show a dialog when click preference
            return;
        } /* end of if */
    }
}
Run Code Online (Sandbox Code Playgroud)