How to use EditTextPreference as a masked Password text field?

前端 未结 5 1877
感动是毒
感动是毒 2021-02-04 23:51

I have a very simple question:
I have a EditTextPreference dialog which I want to use for getting the user\'s password and I want it to be masked.

How c

5条回答
  •  悲哀的现实
    2021-02-05 00:28

    For androidx library you should do it programmatically for example you could do it as follows, optionally I am setting the summary with asterisks according to the length of password:

    [...]
    import android.os.Bundle;
    import android.text.InputType;
    import android.widget.EditText;
    
    import androidx.annotation.NonNull;
    
    import androidx.preference.EditTextPreference;
    import androidx.preference.Preference;
    import androidx.preference.PreferenceFragmentCompat;
    import androidx.preference.PreferenceManager;
    
    import static androidx.preference.EditTextPreference.*;
    
    public class MySettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferences, rootKey);
    
            final EditTextPreference preference = findPreference("password");
    
            if (preference != null) {
                preference.setSummaryProvider(new SummaryProvider() {
                    @Override
                    public CharSequence provideSummary(Preference preference) {
    
                        String getPassword = PreferenceManager.getDefaultSharedPreferences(getContext()).getString("password", "not set");
    
                        //we assume getPassword is not null
                        assert getPassword != null;
    
                        //return "not set" else return password with asterisks
                        if (getPassword.equals("not set")) {
                            return getPassword;
                        } else {
                            return (setAsterisks(getPassword.length()));
                        }
                    }
                });
    
                //set input type as password and set summary with asterisks the new password
                preference.setOnBindEditTextListener(
                        new OnBindEditTextListener() {
                            @Override
                            public void onBindEditText(@NonNull final EditText editText) {
                                editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                                preference.setSummaryProvider(new SummaryProvider() {
                                    @Override
                                    public CharSequence provideSummary(Preference preference) {
                                        return setAsterisks(editText.getText().toString().length());
                                    }
                                });
                            }
                        });
            }
        }
    
        //return the password in asterisks
        private String setAsterisks(int length) {
            StringBuilder sb = new StringBuilder();
            for (int s = 0; s < length; s++) {
                sb.append("*");
            }
            return sb.toString();
        }
    }
    

    In xml you should have something like:

    
    

    For more info please look at developer.android

提交回复
热议问题