프로그래밍 방식으로 EditText의 입력 유형을 PASSWORD에서 NORMAL로 또는 그 반대로 변경


191

내 응용 프로그램에서 EditText기본 입력 유형이 android:inputType="textPassword"deault 로 설정되어 있습니다. 그것은이 가지고 CheckBox판정 오른쪽으로, 즉 글고 NORMAL PLAIN 텍스트의 입력 형식을 변경한다. 그 코드는

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

내 문제는 CheckBox가 선택되어 있지 않으면 입력 유형을 다시 PASSWORD로 설정해야한다는 것입니다. 나는 그것을 사용하여 그것을했다.

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

그러나 해당 편집 텍스트 내부의 텍스트는 여전히 볼 수 있습니다. 놀랍게도, 오리엔테이션을 변경하면 입력 유형이 자동으로 비밀번호로 설정되고 내부 텍스트가 글 머리 기호로 표시됩니다 (비밀번호 표시).

이것을 달성 할 수있는 방법이 있습니까?


텍스트 편집을 위해 전자 메일 유형을 설정하는 방법 mailEdt.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS); 작동하지 않는 것 같습니다.
Mahendran

5
사용하십시오 mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);. 나를 위해 작동합니다.
Rajkiran

답변:


346

같은 문제가있는 사람들에게만 해당됩니다. 프로그래밍 방식으로 해당 EditText에 추가 속성을 추가하기 만하면됩니다.

password.setInputType(InputType.TYPE_CLASS_TEXT |
    InputType.TYPE_TEXT_VARIATION_PASSWORD);

숫자 비밀번호 (핀).

password.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_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

2
정답을 위해 언급 한대로 선택을 변경하는 대신 사용할 수 있습니다.InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
mente

17
나는 세계에서 안드로이드가 커서를 움직이기로 선택한 이유를 이해하지 못하며, 개발자의 삶을 훨씬 어렵게 만듭니다.
Rafael Sanches


2
사용자가 비밀번호 필드의 중간을 편집하는 경우 커서가 항상 끝에있게됩니다. 내가 사용하는 것이 좋습니다 것 editText.getSelectionStart()editText.getSelectionEnd()함께 setSelection(start, end)이 문제를 방지 할 수 있습니다.
JM Lord

1
사람들은 더 이상 내려다 보지 않아야합니다. 이것이 가장 좋은 답변이며 @JM Lord의 제안 된 변경을 제안합니다.
Mark

56

이 코드를 사용하여 비밀번호를 텍스트로 변경하거나 그 반대로 변경

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를 참조하십시오 .


6
HideReturnsTransformationMethod.getInstance ()는 암호를 보여 주었고 PasswordTransformationMethod.getInstance ()는 암호를 숨겼습니다 ... 구현은 정확하지만 주석이 바뀝니다
Ahmed Adel Ismail

2
이것이 최선의 대답입니다. 완성하려면 커서를 다음을 사용하여 마지막 문자로 이동하십시오. txtpassword.setSelection (txtpassword.getText (). length ());
Josh

EL-conte De-monte TereBentikh가 강조한 점으로 인해 잠시 작동하지 않는 것 같습니다. 조쉬 제안도 도움이됩니다. 이것이 가장 좋은 대답입니다.
Ajay

간단하고 가장 좋은 방법
Sam

1
당신은 교수 내 친구입니다! 이 솔루션을 사용하면 비밀번호 모드 (보안 텍스트)로 다시 변경 한 후 글꼴 문제가 발생하지 않습니다.
Tzegenos


12

단일 InputType 할당으로 인해 ImageView 를 사용하여 적은 코드로 가시성을 토글 하는 또 다른 간단한 예 는 동등 연산자 만 필요합니다.

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

같은 결과이지만 짧은 단어를 제공합니다.


12
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());       
                }
            }
        });

6

이것은 나를 위해 일했다 :

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

먼저 질문을 읽으십시오. 암호 필드와 텍스트 필드 사이를 전환하고 싶습니다. 이것은 숫자 텍스트 필드를 줄 것입니다.
Rajkiran

6

Ok 몇 시간 동안 노력한 끝에 마침내 구현했습니다. 아래는 코드입니다 ..

  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 이벤트가 발생한 후 버튼의 텍스트가 표시되는지 확인하십시오. 표시되면 입력 유형을 변경하고 커서 위치를 조정하고 새 텍스트를 숨기기로 설정하십시오.

숨겨져있을 때 ... 암호를 숨기고, 커서를 조정하고 텍스트를 표시로 설정하는 것과 같이 반대로합니다. 그리고 그게 다야. 그것은 매력처럼 작동합니다.



5

이 코드를 사용하여 비밀번호를 텍스트로 바꾸거나 그 반대로 바꾸십시오. 이 코드는 완벽하게 작동했습니다. 이 시도..

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);
    }

}
});

허용되는 답변과 어떻게 다릅니 까? 스팸하기 전에 질문과 답변을주의 깊게 읽으십시오.
Rajkiran

3

이것은 이미지를 표시 / 숨기기위한 전체 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);
        }
    };

감사합니다 edtPassword.getSelectionStart().
CoolMind

3

비밀번호 가시성 전환 기능이 라이브러리 버전 24.2.0을 지원하기 위해 추가되었습니다 EditText.CheckBox .

기본적으로 지원 라이브러리 버전을 24.2.0으로 업데이트 한 다음의 inputType에서 비밀번호 를 설정하여 기본적으로 작동하게 할 수 있습니다 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 의 개발자 문서에서 새로운 기능에 대한 자세한 정보를 얻을 수 있습니다 .


3

지원 라이브러리 v24.2.0부터. 당신은이 아주 쉽게 achivie 수 있습니다

당신이해야 할 일은 단지 :

  1. 의존성에 디자인 라이브러리 추가

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
  2. 사용 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 속성은 암호 토글을 표시합니다

  1. 루트 레이아웃에서 추가하는 것을 잊지 마십시오 xmlns:app="http://schemas.android.com/apk/res-auto"

  2. 다음을 사용하여 비밀번호 토글을 사용자 정의 할 수 있습니다.

app:passwordToggleDrawable-비밀번호 입력 가시성 토글 아이콘으로 사용할 수 있습니다.
app:passwordToggleTint-비밀번호 입력 가시성 토글에 사용할 아이콘입니다.
app:passwordToggleTintMode-배경 색조를 적용하는 데 사용되는 혼합 모드.

TextInputLayout 문서 에서 자세한 내용을 참조하십시오 . 여기에 이미지 설명을 입력하십시오


2

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);


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 ); }Visual Studio / Xamarin .. 에이 코드를 사용하는 방법 ?
sunil y

if () 조건에서 편집 텍스트의 입력 유형을 얻는 방법을 의미합니다 ..?
sunil y

2

어떤 역동적 인 상황 holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);은 작동하지 않으므로 두 가지 모두 더 잘 사용하십시오.

holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());

참고 : arrayaapter 사용과 같은 동적 컨트롤을 사용하는 경우에 적합합니다


2

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대신에 사용InputType.TYPE_CLASS_TEXTHideReturnsTransformationMethod 내가 키보드 텍스트와 숫자를 모두 표시 원하기 때문에

데모


1

나는 제거 할 것이다 android:inputType="textPassword"레이아웃에서 . 방향이 바뀔 때 암호로 다시 전환하는 이유입니다. 방향이 바뀔 때마다보기가 다시 작성됩니다.

첫 번째 문제는 다음을 시도하십시오.

String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);

입력 유형을 변경 한 다음 다시 추가하기 전에 기본적으로 텍스트를 비 웁니다.


작동하지 않는. password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);초기화 직후에 넣으려고 했지만 아아!
Rajkiran

1

비밀번호 편집 텍스트에 비밀번호 가시성을 적용하려면 코드를 완성하십시오.

핸들 만들기 [모든 드로어 블 또는 확인란]

클릭 또는 체크 / 체크 해제시 다음과 같이 작성하십시오.

 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());

커서를 줄 끝으로 재설정합니다.


@ PKR이 구현 친구를 확인하십시오.이 경우 사용할 준비가되었습니다! :)
sud007

@ sud007 Xamarin / visual Studio에서 if 조건을 작성하는 방법을 알고 있습니까?
sunil y

1

확인란의 입력 유형을 변경하므로 다음과 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);

1

변환 방법 사용 :

숨기려고:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

보이는 :

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

그게 다야.


0

@Rajkiran이 제공 한 정답에 대한 추가 의견 만 추가하면됩니다.

etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

사용자가 키보드의 자동 제안으로 인해 짜증나 지 않도록 NORMAL 입력 상태


0

인용구

최종 int [] 개수 = {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]--;
            }

        }
    });

0

Kotlin에서 쓴 neeraj tEverton Fernandes Rosario의 답변을 바탕으로 , 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)
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.