私のアプリケーションでは、デフォルト入力タイプがdeaultによってAndroid:inputType="textPassword"
に設定されているEditText
があります。その右側にCheckBox
があります。これはチェックされると、そのEditTextの入力タイプをNORMAL PLAIN TEXTに変更します。そのためのコードは
password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
私の問題は、そのCheckBoxがチェックされていないとき、それは再びPASSWORDに入力タイプを設定するべきです。私はそれを使ってやった -
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
しかし、そのedittext内のテキストはまだ見えています。そして驚いたことに、オリエンテーションを変更すると、入力タイプが自動的にPASSWORDに設定され、内部のテキストが箇条書きになります(パスワードのように表示されます)。
これを達成するための方法は?
同じ問題を抱えている人々のためだけに。プログラムでそのEditTextに追加の属性を追加するだけで完了です。
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
また、カーソルがEditText内のテキストの末尾にあることを確認してください。入力タイプを変更すると、カーソルは自動的に開始点に設定されるためです。だから私は次のコードを使用することをお勧め:
et_password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length());
データバインディングを使用するときは、次のコードを使用できます。
<data>
<import type="Android.text.InputType"/>
.
.
.
<EditText
Android:inputType='@{someViewModel.isMasked ?
(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) :
InputType.TYPE_CLASS_TEXT }'
Kotlinを使っているなら、
password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
このコードを使用してパスワードをテキストに、またはその逆に変更します。
mCbShowPwd.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// checkbox status is changed from uncheck to checked.
if (!isChecked) {
// hide password
mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
} else {
// show password
mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
}
}
});
完全なサンプルコードについては http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty を参照してください。
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);
上記の方法は本当にうまくいきませんでした。以下の回答は2.2 sdkで動作します。
password.setTransformationMethod(PasswordTransformationMethod.getInstance());
単一の--- InputType割り当てのため、ImageViewを使用して、より少ないコードで表示を切り替える簡単な例をもう1つ示します。
EditText inputPassword = (EditText) findViewById(R.id.loginPassword);
ImageView inputPasswordShow = (ImageView) findViewById(R.id.imagePasswordShow);
inputPasswordShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(inputPassword.getInputType() == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
inputPassword.setInputType( InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
}else {
inputPassword.setInputType( InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
}
inputPassword.setSelection(inputPassword.getText().length());
}
});
交換します。
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
と:
InputType.TYPE_CLASS_TEXT
同じ結果が得られますが、Wordは短くなります。
Checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// checkbox status is checked.
if (isChecked) {
//password is visible
PasswordField.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
} else {
//password gets hided
passwordField.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
}
});
buttons.get(2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if(buttons.get(2).getText().toString().equalsIgnoreCase(getResources().getString(R.string.show))){
editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT);
editTexts.get(1).setSelection(editTexts.get(1).getText().length());
buttons.get(2).setText(getResources().getString(R.string.hide));
}else{
editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
//editTexts.get(1).setTransformationMethod(PasswordTransformationMethod.getInstance());
editTexts.get(1).setSelection(editTexts.get(1).getText().length());
buttons.get(2).setText(getResources().getString(R.string.show));
}
}
});
説明: - デフォルトのテキストが表示されたボタンがあります。 onclickイベントの後、ボタンのテキストが表示されているかどうかを確認します。表示されている場合は、入力タイプを変更し、カーソル位置を調整して新しいテキストを非表示に設定します。
それが隠れているとき...逆にする、すなわちパスワードを隠し、カーソルを調整しそしてテキストを表示として設定する。以上です。それは魅力のように働いています。
これは私のために働いた:
mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
コトリンユーザーの場合:
password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
このコードを使用してパスワードをテキストに、またはその逆に変更します。このコードは私にとっては完璧に機能しました。これを試して..
EditText paswrd=(EditText)view.findViewById(R.id.paswrd);
CheckBox showpass=(CheckBox)view.findViewById(R.id.showpass);
showpass.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(((CheckBox)v).isChecked()){
paswrd.setInputType(InputType.TYPE_CLASS_TEXT);
}else{
paswrd.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
}
}
});
これは、パスワードを表示/非表示にするImage/Buttonの完全なonClickハンドラです。
new OnClickListener() {
@Override
public void onClick(View v) {
// current ursor position
int cursorPosition = edtPassword.getSelectionStart();
// toggles the control variable
isPassworsVisible = !isPassworsVisible;
// sets the image toggler inside edit text
passwordVisible.setImageDrawable(getResources().getDrawable(isPassworsVisible ? R.drawable.ic_eye_checked : R.drawable.ic_eye_unchecked));
// apply input type
edtPassword.setInputType(isPassworsVisible ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
// returns cursor to position
edtPassword.setSelection(cursorPosition);
}
};
パスワードの表示/非表示切り替え機能がライブラリバージョン24.2.0をサポートするために追加され、EditText
を必要とせずにCheckBox
から直接パスワードを切り替えることができます。
基本的にサポートライブラリのバージョンを24.2.0に更新してからinputType
にpasswordのTextInputEditText
を設定することでこれを機能させることができます。これを行う方法は次のとおりです。
<Android.support.design.widget.TextInputLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<Android.support.design.widget.TextInputEditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="@string/password"
Android:inputType="textPassword"/>
</Android.support.design.widget.TextInputLayout>
TextInputLayout の開発者向けドキュメントで、この新機能に関する詳細情報を入手できます。
Support Library v24.2.0以降。これはとても簡単です。
あなたがする必要があるのはただです。
デザインライブラリを依存関係に追加します
dependencies {
compile "com.Android.support:design:25.1.0"
}
TextInputEditText
をTextInputLayout
と組み合わせて使用する
<Android.support.design.widget.TextInputLayout
Android:id="@+id/etPasswordLayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:passwordToggleEnabled="true">
<Android.support.design.widget.TextInputEditText
Android:id="@+id/etPassword"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="@string/password_hint"
Android:inputType="textPassword"/>
</Android.support.design.widget.TextInputLayout>
passwordToggleEnabled
属性はパスワードの切り替えを表示します
ルートレイアウトにxmlns:app="http://schemas.Android.com/apk/res-auto"
を追加することを忘れないでください
以下を使用してパスワードの切り替えをカスタマイズできます。
app:passwordToggleDrawable
- パスワード入力の表示/非表示切り替えアイコンとして使用するために描画可能.app:passwordToggleTint
- パスワード入力の表示/非表示切り替えに使用するアイコン。app:passwordToggleTintMode
- 背景色を適用するために使用されるブレンドモード。
TextInputLayoutのドキュメント に詳細があります。
Visual Studio/Xamarinのための同様の解決策を私が探したところ、このスレッドにたどり着きました。以下はXamarinで私のために働いたものです。この実装はモードを切り替えるときにTYPE_TEXT_FLAG_NO_SUGGESTIONS
フラグを保持することに注意してください。
EditText et = FindViewById<EditText>(Resource.Id.ET);
文字を表示するには:et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;
文字を隠すには:et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;
位置を終了位置に設定するには:int position = et.Text.Length;
et.SetSelection(position, position);
いくつかの動的な状況holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
は動作しないでしょう。
holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());
注:これは、arrayaapterのように動的コントロールを使用している場合に適しています。
パスワードフィールドにsetInputType
を入力すると、 FONTの問題 が発生します。
これはフォントの問題なしにパスワードを表示/隠すための私の解決策です
protected void onCreate(Bundle savedInstanceState) {
...
findViewById(R.id.button_show_hide_password).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPasswordVisible(edtPassword)) {
enableInputHiddenPassword(edtPassword);
} else {
enableInputVisiblePassword(edtPassword);
}
edtPassword.setSelection(edtPassword.getText().length());
}
});
}
final int INPUT_TYPE_VISIBLE_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
final int INPUT_TYPE_HIDDEN_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
private boolean isPasswordVisible(EditText editText) {
return editText.getInputType() == INPUT_TYPE_VISIBLE_PASSWORD;
}
private void enableInputVisiblePassword(EditText editText) {
Typeface cache = editText.getTypeface();
editText.setInputType(INPUT_TYPE_VISIBLE_PASSWORD);
editText.setTypeface(cache);
}
private void enableInputHiddenPassword(EditText editText) {
Typeface cache = editText.getTypeface();
editText.setInputType(INPUT_TYPE_HIDDEN_PASSWORD);
editText.setTypeface(cache);
}
注:キーボードでテキストと数字の両方を表示したいので、InputType.TYPE_TEXT_VARIATION_PASSWORD
またはHideReturnsTransformationMethod
の代わりにInputType.TYPE_CLASS_TEXT
を使用します。
チェックボックスで入力タイプを変更したので、私のOnCheckedChangeListener
で次のようにします。
passwordEdit.setInputType(InputType.TYPE_CLASS_TEXT| (isChecked? InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
そしてそれはついにうまくいきました。
TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
のブール問題のようです。フラグを反転すると問題が解決します。
あなたの場合:
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
パスワード編集テキストでパスワードの可視性を適用する場合は、完全なコードを使用してください。
ハンドルを作成する[任意のドロアブルまたはチェックボックス]
クリックするか、チェックあり/チェックなしでこれを書いてください。
if (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){
edittext.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD );
}else{
edittext.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
}
この行を書くことを忘れないでください:
edittext.setSelection(edittext.getText().length());
カーソルを行末にリセットします。
ブロッククォート
final int [] count = {0};
showandhide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(count[0] ==0)
{
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
count[0]++;
}
else {
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
showandhide.setText("Hide");
count[0]--;
}
}
});
neeraj t および Everton Fernandes Rosario の回答に基づいて、私はKotlinで書きました。password
は、レイアウト内のEditTextのIDです。
// Show passwords' symbols.
private fun showPassword() {
password.run {
val cursorPosition = selectionStart
transformationMethod = HideReturnsTransformationMethod.getInstance()
setSelection(cursorPosition)
}
}
// Show asterisks.
private fun hidePassword() {
password.run {
val cursorPosition = selectionStart
transformationMethod = PasswordTransformationMethod.getInstance()
setSelection(cursorPosition)
}
}
@ Rajkiranが提供する正しい答えに関する追加のコメントだけで、追加することができます。
etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
ユーザーがキーボードの自動提案に煩わされないように、NORMAL入力状態にします。
あなたのレイアウトからAndroid:inputType="textPassword"
を削除します。そのため、方向が変わったときにパスワードに戻るのです。向きが変わるたびにビューが再作成されるためです。
最初の問題としてこれを試してください:
String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);
基本的に、入力タイプを変更してから追加する前にテキストを空にします。