如何在EditTextPreference中调用确认按钮

3
我在PreferenceActivity中有一个EditTextPreference。当用户点击EditTextPreference时,将会显示对话框。在对话框中,用户可以输入值,并且对话框有“确定”和“取消”按钮。我想调用“确定”按钮的单击事件来检查值,但我不知道如何调用单击事件。
我知道可以使用EditTextPreference.setOnPreferenceChangeListener(),但我想知道是否可以使用“确定”按钮的单击事件。

通过创建自定义的EditTextPreference,可以实现这一点。请查看此链接:http://stackoverflow.com/a/15219411/2107118 - appsroxcom
3个回答

4
你可以扩展EditTextPreference来控制单击处理程序。
package myPackage;
public class CustomEditTextPreference extends EditTextPreference {

    public CustomEditTextPreference(Context context) {
        super(context);
    }

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

    public CustomEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (which == DialogInterface.BUTTON_POSITIVE) {
            // add Handler here
        }
        super.onClick(dialog, which);
    }

}

在Xml中,不要使用<EditTextPreference/>,而是像这样引用它:
<myPackage.CustomEditTextPreference android:dialogTitle="Registration Key" android:key="challengeKey" android:title="Registration Key" android:summary="Click here to enter the registration key you received by email."/>

我最初只使用了一个构造函数尝试,但是出现了"Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class"的错误。我后来将三个构造函数都覆盖重写,终于解决了问题! - wrapperapps
1
是的,构造函数的调用取决于它如何被实例化(XML或非XML)。为了覆盖所有3个构造函数,请使用所有选项。 - tmanthey

3
实际上你做不到,因为首选项使用了内部的AlertDialog.Builder,并且每次单击首选项时都会创建一个新的对话框。下一个问题是对话框构建器为您设置了点击监听器,如果您覆盖它们,可能会破坏按钮点击的关闭行为。
这困扰着我,因为我想要一个只在有效输入时关闭的首选项(否则会显示一个toast,用户应该按取消键,如果他无法正确操作)。
(如果您确实需要针对此问题的解决方案)您可以在此处找到验证DialogPreference的通用解决方案,以及在此处找到我自己编写的验证EditTextPreference。

@Knickedi,提供的链接似乎已经失效了。你的解决方案还能在其他地方找到吗? - THelper
感谢您的提示。该项目已迁移到GitHub,您可以在那里找到代码(链接已修复)。 - Knickedi
我真的很讨厌Android Preference API。我经常遇到它无法处理的情况,而这些情况我认为是非常普遍的。 - theblang

1

你的偏好设置活动似乎没有实现

OnSharedPreferenceChangeListener

你可能想阅读这个问题的优秀答案:更新EditPreference


1
谢谢,我使用了OnSharedPreferenceChangeListener来解决我的问题,但@Knickedi的答案更实用,所以我采纳了他的答案,同时也给你投了一票。谢谢。 - pengwang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接