【问题标题】:Open EditTextPreference through code (programmatically)通过代码打开 EditTextPreference(以编程方式)
【发布时间】:2011-06-18 14:12:09
【问题描述】:

我使 EditTextPreference 'textPasscode' 依赖于 CheckBoxPreference 'checkBoxPasscode'。我希望用户选中复选框后立即打开“textPasscode”。这甚至可能吗? 如果是,我可以在 onSharedPreferenceChanged() 函数中使用什么?

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

【问题讨论】:

    标签: android android-edittext preferences


    【解决方案1】:

    这个问题对我来说很烦人,所以在实施 Sandor 建议后,我在 Android 参考中搜索了更好的解决方案,看看我找到了什么。
    EditTextPreference 继承自 DialogPreference 而这个类有 showDialog 方法,所以我从 EditTextPreference 创建了一个带有 show 方法的新类,它的工作原理就像一个魅力。

    这里有一些代码:

    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"
    />
    

    我做的最后一件事是 PreferenceActivity 中的 onSharedPreferenceChanged 方法

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

    ps.:实际上我没有使用 PreferenceFragment,因为我想要 pre-honeycomb 兼容性,但我认为这段代码变化不大。

    【讨论】:

    • 我有时会收到 BadTokenException: Unable to add window 堆栈跟踪。知道为什么吗?
    • 当我离开PreferenceActivity 然后返回时似乎会发生这种情况。我猜context 可能有问题?
    • 这也适用于自定义 ListPreference。
    • 有没有办法在 PreferenceActivity 之外找到Preference?
    【解决方案2】:

    我遇到了同样的问题。 我想知道这不是一个常见的问题,网上关于此的搜索结果很少。

    虽然有一个明显的解决方法,但似乎无法从代码中手动显示 EditTextPreference。

    您可以通过创建警报对话框并处理 OK 按钮的 onclick 事件来实现相同的外观和行为。

    这是文本输入对话框的简单通用代码:

    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 变量来接收用户输入的输入字符串。

    我希望它有助于为搜索此问题的人节省一些时间。

    【讨论】:

    • 非常感谢。这绝对有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多