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 can I do that?
Here is a short example using xml:
<EditTextPreference android:key="@string/key" android:title="@string/title" android:summary="@string/summary" android:inputType="textPassword" />
Or you can use numberPassword
instead of textPassword
.
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:
<EditTextPreference android:dialogMessage="Enter your password" android:dialogTitle="Password" android:key="password" android:title="Password" />
For more info please look at developer.android
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With