프로그래밍 방식으로 EditText의 inputType을 설정 하시겠습니까?


216

프로그래밍 방식으로 EditText의 입력 유형을 어떻게 설정합니까? 노력하고있어:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

효과가없는 것 같습니다.

답변:


213

TextView docs 에 따르면 android : password의 프로그래밍 버전은 setInputType ()이 아니라 setTransformationMethod ()입니다. 그래서 같은 :

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

트릭을해야합니다.


4
여기에 추가하려면 setInputType 대신 setTransformationMethod를 호출해야합니다 . setTransformationMethod 다음에 setInputType을 호출하면 EditText가 다시 암호 모드에 있지 않습니다.
— Paul Ryland

11
이 답변은 묻는 질문에 잘못되었습니다. 입력 한 텍스트 만 변환합니다 EditText(문자를 암호 점으로 바꿉니다). 이것은 EditText그 자체 로 입력 될 수있는 것에 영향을 미치지 않습니다 .
— slinden77

4
setInputType은 궁극적으로 내부에서 setTransformationMethod를 호출하므로 TYPE_TEXT_VARIATION_PASSWORD를 setInputType에 전달하면 자동으로 수행됩니다. setInputType을 호출 한 후 setSingleLine을 호출하면 문제가 발생하는 것 같습니다. setInputType을 호출하면 setTransformationMethod를 null 또는 한 줄 변환기로 호출하여 암호 변환기를 지 웁니다.
— sparkym3

setTransformationMethod (PasswordTransformationMethod.getInstance ()) 호출 후 편집 할 수 없음
— sujith s

그러나 암호 필드를 사용하는 시간이 옆에 제안 텍스트에 표시됩니다
— 게리 데이비스에게

408

프로그래밍 방식으로 EditText의 입력 유형을 설정하려면 입력 클래스 유형이 텍스트임을 지정해야합니다.

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

2
당신의 팁은 나를 위해 완벽하게 작동했습니다! 프로그래밍 방식으로 입력 유형을 여러 줄로 설정하는 것과 비슷한 문제가있었습니다.
— Anna Lam

여기에 비트 단위 OR 연산자를 갖는 것이 어떤 의미입니까? 죄송합니다. Android를 처음 사용합니다.
— sanjeev

InputType에 동의하지 않습니다 .TYPE_TEXT_VARIATION_PASSWORD는 작동하지 않지만 setTransformationMethod (PasswordTransformationMethod.getInstance ()); 않습니다!
— Lluis Felisart

38

표준 키보드에 표시된 다양한 입력 유형은 다음과 같습니다.

입력 유형 데모

프로그래밍 방식으로 입력 유형 설정

editText.setInputType(InputType.TYPE_CLASS_TEXT);

그 밖의 다른 옵션 TYPE_CLASS_TEXT은 설명서 에서 찾을 수 있습니다 .

XML에서 입력 유형 설정

<EditText
    android:inputType="text"
/>

그 밖의 다른 옵션 text은 설명서 에서 찾을 수 있습니다 .

보충 코드

위 이미지의 코드는 다음과 같습니다.

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;
    List<InputTypeItem> inputTypes;
    int counter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);
        initArray();
    }

    public void onChangeInputTypeButtonClick(View view) {
        if (counter >= inputTypes.size()) {
            startOver();
            return;
        }
        textView.setText(inputTypes.get(counter).name);
        editText.setInputType(inputTypes.get(counter).value);
        editText.setSelection(editText.getText().length());
        counter++;
    }

    private void startOver() {
        counter = 0;
        textView.setText("");
        editText.setInputType(InputType.TYPE_CLASS_TEXT);
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }


    private void initArray() {
        inputTypes = new ArrayList<>();
        inputTypes.add(new InputTypeItem("date",  InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE));
        inputTypes.add(new InputTypeItem("datetime", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("none", InputType.TYPE_NULL));
        inputTypes.add(new InputTypeItem("number",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("numberDecimal",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL));
        inputTypes.add(new InputTypeItem("numberPassword",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("numberSigned", InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED));
        inputTypes.add(new InputTypeItem("phone",  InputType.TYPE_CLASS_PHONE));
        inputTypes.add(new InputTypeItem("text",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("textAutoComplete", InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE));
        inputTypes.add(new InputTypeItem("textAutoCorrect",  InputType.TYPE_TEXT_FLAG_AUTO_CORRECT));
        inputTypes.add(new InputTypeItem("textCapCharacters",  InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS));
        inputTypes.add(new InputTypeItem("textCapSentences",  InputType.TYPE_TEXT_FLAG_CAP_SENTENCES));
        inputTypes.add(new InputTypeItem("textCapWords",  InputType.TYPE_TEXT_FLAG_CAP_WORDS));
        inputTypes.add(new InputTypeItem("textEmailAddress",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textEmailSubject", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT));
        inputTypes.add(new InputTypeItem("textFilter",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER));
        inputTypes.add(new InputTypeItem("textLongMessage",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE));
        inputTypes.add(new InputTypeItem("textMultiLine",  InputType.TYPE_TEXT_FLAG_MULTI_LINE));
        inputTypes.add(new InputTypeItem("textNoSuggestions", InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
        inputTypes.add(new InputTypeItem("textPassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("textPersonName", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME));
        inputTypes.add(new InputTypeItem("textPhonetic",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC));
        inputTypes.add(new InputTypeItem("textPostalAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS));
        inputTypes.add(new InputTypeItem("textShortMessage", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE));
        inputTypes.add(new InputTypeItem("textUri",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI));
        inputTypes.add(new InputTypeItem("textVisiblePassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
        inputTypes.add(new InputTypeItem("textWebEditText",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT));
        inputTypes.add(new InputTypeItem("textWebEmailAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textWebPassword", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD));
        inputTypes.add(new InputTypeItem("time", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME));
    }

    class InputTypeItem {
        private String name;
        private int value;
        InputTypeItem(String name, int value) {
            this.name = name;
            this.value = value;
        }
    }
}

또한보십시오


29

나는 모든 것을 해결했다

.setInputType(InputType.TYPE_CLASS_NUMBER);

명확한 데이터를 참조하십시오

.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);

점을 참조하십시오 (데이터가 숫자이면 다른 클래스를 선택하지 않습니다)


감사합니다! 한 가지 질문은, 일반 텍스트에서 비밀번호 유형으로 변경할 때 왜 '또는'을 추가해야합니까? 왜 이렇게 간단하게 할 수 없습니까? .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? 시도했지만 작동하지 않았습니다.
— UnknownUser

15

숫자 만 허용하려면 :

password1.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_CLASS_NUMBER);

비밀번호를 변환 (숨기기)하려면 다음을 수행하십시오.

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// 요구 사항에 따라 TYPE _...을 (를) 변경할 수 있습니다.


5

코 틀린의 경우 :

    val password = EditText(this)
    password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
    password.hint = "Password"

4

이것은 암호와 자유 텍스트 모드 사이를 전환하려는 저 같은 다른 사람들에게 도움이 될 수 있습니다. 제안 된 입력 방법을 사용해 보았지만 한 방향으로 만 작동했습니다. 암호에서 텍스트로 갈 수 있었지만 되돌릴 수 없었습니다. 토글 (예 : 비밀번호 표시 확인란)을 처리하려는 경우

       @Override
        public void onClick(View v)
        {
            if(check.isChecked())
            {
                edit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                Log.i(TAG, "Show password");
            }
            else
            {
                edit.setTransformationMethod(PasswordTransformationMethod.getInstance());
                Log.i(TAG, "Hide password");
            }
        }

나는 이것을 해결책 으로 인정 해야한다. 몇 시간 전에 발견했으면 좋겠다!


1

비밀번호 숨기기를 해제하려면

editText.setInputType(
      InputType.TYPE_CLASS_TEXT|
      InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
);

비밀번호를 다시 숨기려면

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

0

이것을 레이아웃의 EditText / TextView 태그에 추가하십시오

android:password="true"

편집 : 난 그냥 당신의 게시물을 다시 읽고 아마도 건설 후이 작업을 수행해야합니다. 스 니펫이 작동하지 않는 이유를 모르겠습니다.


이 경우 레이아웃 파일이 없으며 필드가 프로그래밍 방식으로 생성됩니다.
— user246114

예, 건설 후에 완료되었지만 왜 작동하지 않는지 확실하지 않습니다!
— user246114

6
이 옵션은 더 이상 사용되지 않습니다 !!
— swiftBoy

이 것은 오래된 안드로이드 2.3에서 작동하는 유일한 것입니다. 나는 대답을 upvoted했습니다.
— djdance

0

예상 답변이에 있음을 알고 Java있습니다. 그러나 여기 2 센트의 조언은 항상 XML( 관련된 기본 항목) 보기 관련 항목을 처리하려고 하므로이 xml사용 사례를 처리 하는 대신 속성을 사용하는 것이 좋습니다 .java

    <EditText
     android:inputType="textPassword"/>

2
경우에 따라 필드에 입력 한 비밀번호 숨기기 / 표시와 같은 다른 입력 유형간에 전환 할 수 있습니다.
— William

1
그러나 EditText에는 암호를 표시하거나 숨길 수있는 옵션이있어 직접 암호를 입력 할 필요가 없으며 멋진 애니메이션을 제공합니다.
— pratham kesarkar

정보 주셔서 감사합니다, 여기에 그것을 보았습니다 stackoverflow.com/a/41163578/3310235
— William

0

숨는 장소:

edtPassword.setInputType(InputType.TYPE_CLASS_TEXT);
edtPassword.setTransformationMethod(null);

보여 주다:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());

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

또한이 함수가 호출 된 후 커서가 editText의 시작점으로 이동하도록주의해야하므로 커서를 끝점으로 다시 이동해야합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.