web-dev-qa-db-ja.com

EditTextPreferenceをマスクされたパスワードテキストフィールドとして使用する方法

私は非常に簡単な質問をします:
ユーザーのパスワードを取得するために使用するEditTextPreferenceダイアログがあり、マスクする必要があります。

どうやってやるの?

46
Avi Shukron

次に、xmlを使用した短い例を示します。

<EditTextPreference
    Android:key="@string/key"
    Android:title="@string/title"
    Android:summary="@string/summary"   
    Android:inputType="textPassword" />

または、numberPasswordの代わりにtextPasswordを使用できます。

114
inazaruk

Android:inputType="numberPassword"が機能しません。 Eclipseは私に、この属性にはString値は許可されていないと言っています。だから私は以下を使用しました:

<EditTextPreference
    Android:key="@string/key"
    Android:title="@string/title"
    Android:summary="@string/summary"   
    Android:inputType="number"
    Android:password="true" />

これにより、点線のテキスト表示と入力用の数字キーボードを備えたEditTextPreferenceが得られました。

4
CrizZ

デバイスのローテーションで次のimeOptionを追加するだけで十分な後もパスワードマスクを保持したい場合:

編集テキストレイアウト_Android:imeOptions="flagNoExtractUi"_

またはプログラムでyourEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);

0
Paolo M

androidxライブラリの場合、プログラムで行う必要があります。たとえば、次のように行うことができます。オプションで、パスワードの長さに応じてアスタリスクを使用して要約を設定します。

[...]
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();
    }
}

Xmlでは、次のようなものが必要です。

<EditTextPreference
    Android:dialogMessage="Enter your password"
    Android:dialogTitle="Password"
    Android:key="password"
    Android:title="Password" />

詳しくは developer.Android をご覧ください。

0
F.Mysir