EditTextPreference inputType = textPassword не работает - PullRequest
2 голосов
/ 02 февраля 2020

Я создал функцию SettingsActivity с шаблоном и поместил EditTextPreference в мои root_preferences. xml. Он должен содержать пароль, поэтому я отредактировал его так:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/colorBackground">

<EditTextPreference
        android:id="@+id/etPassword"
        android:dialogTitle="Passwort"
        android:inputType="textPassword"
        android:key="pref_password"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:title="Passwort" />

Моя проблема в том, что ни inputType, singleLine, ни setAllOnFocus не работают. Вы знаете, в чем проблема?

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Вы не можете сделать это из XML, но EditTextpreference предоставляет EditText, чтобы вы могли сделать это программно. После того, как вы загрузите настройки в своей Деятельности / Фрагмент, вы можете сделать:

   EditTextPreference pref = (EditTextPreference) 
   PreferenceManager.findPreference("edit");  
   EditText prefEditText = pref.getEditText();
   prefEditText.setInputType(InputType.TYPE_CLASS_TEXT); // set properties here
   prefEditText.setSingleLine(true);
0 голосов
/ 31 марта 2020

В моем случае InputType не скрывает пароль при вводе, а также в сводке. Вот как я обошёл проблему

XML file

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <EditTextPreference
        app:key="pref_password"
        app:title="Password"
        app:dialogTitle="Set password"
        app:useSimpleSummaryProvider="true"
    />
</PreferenceScreen>

В наборе PreferenceFragmentCompat в вашем XML найдите ваш EditTextPreference в разделе onCreatePreferences и добавьте OnBindEditTextListener к нему.

public static class YourFragment extends PreferenceFragmentCompat {
  @Override
  public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    // Find the password EditText
    EditTextPreference etpPassword = getPreferenceManager().findPreference("pref_password");

    etpPassword.setOnBindEditTextListener(new EditTextPreference.OnBindEditTextListener() {
      @Override
      public void onBindEditText(@NonNull EditText editText) {
        // Set keyboard layout and some behaviours of the field
        editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

        // Replace -> android:singleLine="true"
        // Not needed for password field, or set it before setTransformationMethod
        // otherwise the password will not be hidden
        //editText.setSingleLine(true);

        // Replace -> android:inputType="textPassword"
        // For hiding text
        editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

        // Replace -> android:selectAllOnFocus="true"
        // On password field, you cannot make a partial selection with .setSelection(start, stop)
        editText.selectAll();

        // Replace -> android:maxLength="99"
        editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(99)});
      }
    });          
  }
}

Вы также можете создать свой собственный класс EditTextPreference и устанавливать другие вещи.

public class YourEditTextPreference extends EditTextPreference {

  // Add some preferences, which can be used later for checking
  private Integer mPasswordMinSize = 6;

  public EditTextPreferencePassword(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init();
  }

  public EditTextPreferencePassword(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
  }

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

  public EditTextPreferencePassword(Context context) {
    super(context);
    init();
  }

  private void init(){
    // Set Dialog button text
    this.setNegativeButtonText("RETURN");
    this.setPositiveButtonText("CHECK");

    this.setOnBindEditTextListener(new OnBindEditTextListener() {
      @Override
      public void onBindEditText(@NonNull EditText editText) {
        // Put field parameters here
      }
    });
  }

  public void setMinSize(int minSize) { mPasswordMinSize = minSize; }
  public Integer getMinSize(){ return mPasswordMinSize; }

  // Hide password by stars
  @Override
  public CharSequence getSummary() {
    return getText().equals("") ? super.getSummary() : "*******";
  }
}

А в вашем XML изменить <EditTextPreference до <complet.path.to.YourEditTextPreference

...