AndroidX: установите клавишу Enter для проверки диалогового окна EditTextPreference - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь создать экран предпочтений с помощью AndroidX , но я сталкиваюсь с небольшой проблемой ...

Когда я проверяю свою запись кнопкой "ОК" на виртуальная клавиатура, предпочтение не проверяется. (клавиатура скрыта, вот и все ...)

В AndroidX мы больше не можем переопределить showDialog() в EditTextPreference ... и я не смог найти другой способ доступа к диалоговому окну, чтобы закрыть it.

В заключение, что я буду sh: действие кнопки DONE на виртуальной клавиатуре подтверждает AlertDialog.

enter image description here

Вот мой пример кода:

XML file

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
    <EditTextPreference
        app:key="pref_1"
        app:title="Test"
        app:useSimpleSummaryProvider="true" /> 
</PreferenceScreen> 

Предпочтительная деятельность

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);
                }
            });
        }
    }
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Если вы хотите проверить это значение обновления текста, вам нужно использовать этот слушатель

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
            }
        });

вот пример использования истинного ложного возврата

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;
            }
        }
    }
}

Так как вы хотите чтобы закрыть диалоговое окно вручную, вы можете сделать это следующим образом, потому что нет прямого метода, чтобы получить диалоговое окно и закрыть его.

Я обновил слушатель диалогового окна, отклонив его, так как вам нужно сохранить передачу данных. Значение true в методе onDialogClosed поможет сохранить ваши данные

void dismissDialog(){

        for(Fragment fragments : HeaderFragment.this.getActivity().getSupportFragmentManager().getFragments()){
            if(fragments instanceof EditTextPreferenceDialogFragmentCompat){
                EditTextPreferenceDialogFragmentCompat dialog = ((EditTextPreferenceDialogFragmentCompat) fragments);
                dialog.onDialogClosed(true);
                dialog.dismiss();
                return;
            }
        }
    }
0 голосов
/ 03 апреля 2020

Я нашел другой способ. Я не думаю, что это лучше, но если это может кому-нибудь помочь ...

PreferenceFragmentCompat настроено

public class PreferenceFragmentCompatCustom extends PreferenceFragmentCompat {
    private static final String DIALOG_FRAGMENT_TAG =
            "androidx.preference.PreferenceFragment.DIALOG";
    private DialogFragment mDialogFragment;

    @Override
    public void onDisplayPreferenceDialog(Preference preference) {
        if (getActivity() instanceof MySettingsActivity) {
            final DialogFragment f;
            if (preference instanceof EditTextPreference) {
                f = EditTextPreferenceDialogFragmentCompat.newInstance(preference.getKey());
            } else if (preference instanceof ListPreference) {
                f = ListPreferenceDialogFragmentCompat.newInstance(preference.getKey());
            } else {
                throw new IllegalArgumentException("Tried to display dialog for unknown " +
                        "preference type. Did you forget to override onDisplayPreferenceDialog()?");
            }
            f.setTargetFragment(this, 0);

            // Expose the dialog
            mDialogFragment = f;

            f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);

        }else{
            super.onDisplayPreferenceDialog(preference);
        }
    }

    public DialogFragment getDialog(){ return mDialogFragment;}

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {}
}

Предпочтение деятельности

public class MySettingsActivity extends AppCompatActivity implements
        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {

    [...]

    public static class HeaderFragment extends PreferenceFragmentCompatCustom {
        @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);

                    editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                        @Override
                        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                            if (actionId == EditorInfo.IME_ACTION_DONE) {
                                // If callOnClick, do not save value here
                                //etpTest.setText(v.getText().toString());
                                // If dismiss, the preference is not set !
                                //getDialog().dismiss();

                                ((AlertDialog) getDialog().getDialog())
                                               .getButton(DialogInterface.BUTTON_POSITIVE)
                                               .callOnClick();
                                return true;
                            }
                            return false;
                        }
                    });
                }
            });
        }
    }
}
...