IT

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

lottoking 2020. 5. 21. 08:21
반응형

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


내 응용 프로그램에서 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);

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

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


같은 문제가있는 사람들에게만 해당됩니다. 프로그래밍 방식으로 해당 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 ());

EditText에 inputType을 설정 하시겠습니까?


단일 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

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


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

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

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


이것은 나를 위해 일했다 :

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

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

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

}
});

kotlin 사용자의 경우 :

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

이것은 이미지를 표시 / 숨기기위한 전체 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에서 비밀번호 를 설정하여 기본적으로 작동하게 할 수 있습니다 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 의 개발자 문서에서 새로운 기능에 대한 자세한 정보를 얻을 수 있습니다 .


지원 라이브러리 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 문서 에서 자세한 내용을 참조하십시오 .여기에 이미지 설명을 입력하십시오


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 사용과 같은 동적 컨트롤을 사용하는 경우에 적합합니다


After you setInputType for a password field, you will have problem with FONT
Here is my solution for show/hide password without font problem

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

Note: I use InputType.TYPE_TEXT_VARIATION_PASSWORD instead of InputType.TYPE_CLASS_TEXT or HideReturnsTransformationMethod because I want the keyboard display both text and number

DEMO


I would remove android:inputType="textPassword" from your layout. That is why it is switching back to password when the orientation changes. Because each time the orientation changes the view is being recreated.

As for the first problem try this:

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

basically emptying out the text before you change the input type and then add it back.


I change the input type on my checkbox, so on my OnCheckedChangeListener i do:

passwordEdit.setInputType(InputType.TYPE_CLASS_TEXT| (isChecked? InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));

And it finally worked.

Seems like a boolean problem with TYPE_TEXT_VARIATION_VISIBLE_PASSWORD. Invert the flag and it should fix the problem.

In your case:

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Just an additional comment on the correct answer provided by @Rajkiran, you may want to add

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

to the NORMAL input state so that the users wont be annoyed by the keyboard's auto-suggestion


Complete code when you want to apply the Password visibility in Password edit text.

Create a handle [ Any drawable or Checkbox]

on click or on Checked/Uncheck write this:

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

Do not forget to write this line:

 edittext.setSelection(edittext.getText().length());

It resets the cursor to the end of line.


Blockquote

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

        }
    });

Based on answers of neeraj t and Everton Fernandes Rosario I wrote in Kotlin, where password is an id of an EditText in your layout.

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

참고URL : https://stackoverflow.com/questions/9892617/programmatically-change-input-type-of-the-edittext-from-password-to-normal-vic

반응형