AndroidX:设置 Enter 键以验证 EditTextPreference 对话框

A-N*_*die 2 android edittextpreference imeoptions appcompatactivity androidx

我正在尝试使用AndroidX制作首选项屏幕,但遇到了一个小问题......

当我使用虚拟键盘上的“确定”按钮验证输入时,首选项未验证。(键盘被隐藏了,仅此而已......)

使用 AndroidX,我们无法再覆盖showDialog()...EditTextPreference并且我找不到另一种方法来访问该对话框以将其关闭。

总之,我希望:虚拟键盘上按钮的 DONE 操作验证 AlertDialog。

在此输入图像描述

这是我的示例代码:

XML文件

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
    <EditTextPreference
        app:key="pref_1"
        app:title="Test"
        app:useSimpleSummaryProvider="true" /> 
</PreferenceScreen> 
Run Code Online (Sandbox Code Playgroud)

偏好活动

public class MySettingsActivity extends AppCompatActivity implements
        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {

    [...]

    public static class HeaderFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.header_preferences, rootKey);

            EditTextPreference pref1 = getPreferenceManager().findPreference("pref_1");
            pref1.setOnBindEditTextListener(new EditTextPreference.OnBindEditTextListener() {
                @Override
                public void onBindEditText(@NonNull EditText editText) {
                    editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
                    editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
                }
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

R7G*_*R7G 5

如果您想验证文本的更新值,您需要使用此侦听器

pref1.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                // put validation here..

                Log.d("Prefrence====>",newValue+"<===  validate you can validate this value");

                return true; //if you pass false here the updated value will not save
            }
        });
Run Code Online (Sandbox Code Playgroud)

这是使用 true false 返回的示例

public static class HeaderFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.headerpref, rootKey);

        EditTextPreference pref1 = getPreferenceManager().findPreference("pref_1");

        pref1.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                // put validation here..

                Log.d("Prefrence====>",newValue+"<===  validate you can validate this value");
                if(newValue.toString().length()>0){
                    return  true;
                }else return false;
            }
        });

        pref1.setOnBindEditTextListener(new EditTextPreference.OnBindEditTextListener() {
            @Override
            public void onBindEditText(@NonNull EditText editText) {
                editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
                editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
                editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                    @Override
                    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                        //Your dialog will dissmiss on ok click
                        if(actionId==EditorInfo.IME_ACTION_DONE)dismissDialog();
                        return false;
                    }
                });

            }
        });


    }
void dismissDialog(){
        for(Fragment fragments : HeaderFragment.this.getActivity().getSupportFragmentManager().getFragments()){
            if(fragments instanceof EditTextPreferenceDialogFragmentCompat){
                EditTextPreferenceDialogFragmentCompat dialog = ((EditTextPreferenceDialogFragmentCompat) fragments);
                dialog.onDialogClosed(true);
                dialog.dismiss();
                return;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于您想手动关闭对话框,因此可以这样做,因为没有直接方法可用于获取对话框并关闭它。

我更新了对话框关闭侦听器,因为您需要保存在onDialogClosed方法中传递 true 的数据将有助于保存您的数据

void dismissDialog(){

        for(Fragment fragments : HeaderFragment.this.getActivity().getSupportFragmentManager().getFragments()){
            if(fragments instanceof EditTextPreferenceDialogFragmentCompat){
                EditTextPreferenceDialogFragmentCompat dialog = ((EditTextPreferenceDialogFragmentCompat) fragments);
                dialog.onDialogClosed(true);
                dialog.dismiss();
                return;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)