Android에서 EditText 비활성화


195

내 응용 프로그램에는 사용자에게 쓰기 권한이 아닌 읽기 권한 만있는 EditText가 있습니다.

코드에서 설정했습니다 android:enabled="false".

EditText의 배경이 어둡게 바뀌었지만 클릭하면 키보드가 나타나고 텍스트를 변경할 수 있습니다.

EditText를 비활성화하려면 무엇을 설정해야합니까?


2
뷰의 스타일과 스크롤 동작을 모두 유지할 수 있습니다. EditText이 속성을 유지하면서 잠시 비활성화하려면 이 라이브러리UI.setReadOnly(myEditText, true) 에서 사용 하십시오 . 라이브러리없이이 동작을 복제하려면 이 작은 방법 의 소스 코드 를 확인하십시오 .
caw

답변:


245

나는 올바른 것이 설정 될 것이라고 믿는다 android:editable="false".

받는 내 링크 지점의 속성 이유를 궁금해한다면 TextView, 당신은 대답이 때문에 EditText상속에서 TextView:

EditText는 TextView에 대한 얇은 비니어로 편집 가능하도록 자체 구성됩니다.

업데이트 :
아래 의견에서 언급했듯이 editable( API 레벨 3 이후 ) 더 이상 사용되지 않습니다 . 대신 inputType(값과 함께 none) 를 사용해야합니다 .


고마워 Nailuj, 불행히도 작동하지 않았습니다. 추천 키보드를 추가하면 팝업 창이 나타나고 텍스트를 변경할 수 있습니다.
Hesam

18
android : editable은 더 이상 사용되지 않습니다. 대신 android : inputType = "none"을 사용해야하지만 버그가 포함되어 작동하지 않습니다. : 우리가 여기에 문제를 스타 있다면 그것은 좋은 일 것입니다 code.google.com/p/android/issues/detail?id=2854
빅토르 Brešan

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
Asymptote

28
android:editable="false" android:focusable="false"나를 위해 잘 작동합니다 (더 이상 사용되지 않음, android : editable은 android : inputType과 관련이 없다고 생각합니다)
Muhammad Babar

8
android : inputType = "none"이 작동하지 않는 모든 사람들을 위해 android : inputType = "none"with android : focusable = "false"
Surendra Kumar

162

사용 EditText.setFocusable(false) 하지 않도록 설정 편집에
EditText.setFocusableInTouchMode(true)편집 할 수 있도록;


작동하지만 뷰를 편집 할 수는 있지만 보이지는 않으므로보기에는 좋지 않습니다. 내보기에 사용자 정의 배경이 있었기 때문에 잘 작동 했으므로 +1입니다.
kaneda

4
@ 카네다. 나는 실제로 이것을 선호합니다. 상자가 회색으로 표시되는 것을 원하지 않습니다. :)
Doomsknight

1
Android 4.4에서이 옵션은 원래 텍스트 색상을 유지합니다. 를 사용 editText.setEnabled(false);하면 텍스트 색상이 회색으로 바뀝니다. 그러나 스피너는를 사용할 때 텍스트 색상을 변경하지 않으므로 setEnabled일관성이없는 환경이됩니다.
tbraun

왜 안돼 setFocusable(true)? 차이점이 링크 참조 setFocusable()setFocusableInTouchMode(): stackoverflow.com/questions/23799064/...
kenju

이것은 내 요구에 정말로 맞습니다. 내부에 EditText가있는 복합 사용자 정의보기를 만들었습니다. 클릭 만 허용하도록 날짜를 사용자 정의보기로 만드는 데 문제가 있지만 날짜 선택기 대화 상자가 시작되므로 편집 할 수 없습니다. 이 솔루션은 onClickListeners를 비활성화하지 않기 때문에 작동합니다.
Neon Warge

64

다음 방법을 시도해 볼 수 있습니다.

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

활성화 된 EditText :

활성화 된 EditText

비활성화 된 EditText :

비활성화 된 EditText

그것은 나를 위해 일하고 그것이 당신을 도울 수 있기를 바랍니다.


1
이것은 TextView처럼 보입니다. 너무 놀랍습니다. 이것이 내가 찾는 것입니다.
Yunus

4
누군가가 다시 사용하도록 설정하는 데 동일한 문제가있는 경우 editText.setFocusableInTouchMode(true)대신 전화를 걸어야 editText.setFocusable(true)합니다.
다트 데가

61

이것을 사용하여 사용자 입력을 비활성화하십시오

android:focusable="false"

android : editable = "false" 이 메소드는 더 이상 사용되지 않습니다.


1
이것이 정답입니다. 다른 답변에서 제안 된대로 입력 유형을 '없음'으로 설정하면 항상 작동하지 않습니다. 'false'로 설정하면 편집을 방지 할 수 있지만 원하는 텍스트가 흐리게 표시됩니다.
jerry

36

edit disable을 EditText위해 focusable OR 을 사용할 수 있다고 생각 enable하지만

  1. android:enabled=...또는 사용editText.setEnabled(...)

    또한 텍스트 색상 을 회색으로 변경 합니다 EditText.
    클릭하면 효과가 없습니다

  2. android:focusable=...또는 editText.setFocusable(false)- 사용editText.setFocusableInTouchMode(true)

    그것은 변경되지 않습니다 의 텍스트 컬러 EditText
    가 강조 클릭하면을 EditText몇 밀리 초 약에 대한 결론을

산출

여기에 이미지 설명을 입력하십시오


이보기를 터치 할 때 android:longClickable="false"와 함께 추가 android:focusable="false"하여 임시 하이라이트를 제거 할 수 있습니다 . 또한 "모두 선택"팝업이 나타나지 않습니다.
CzarMatt

19

으로는 android:editable="false"depricated.You가 InputType 사용할 수 있습니다 TYPE_NULL을 글고 치기에

이처럼 사용하십시오 :

editText.setInputType(InputType.TYPE_NULL);

1
필드에서 onClickListener를 비활성화하지 않기 때문에이 답변을 좋아했습니다.
Harsh Ganatra

inputType이 비밀번호 인 경우 어떻게해야합니까? TYPE_NULL은 비밀번호를 표시합니다.
ilyamuromets

17

대로 android:editable="false"에서 사용되지 않는xml

android:enabled="false"간단하게 사용하십시오 . 왜 더 많은 코드를 사용합니까?

원하는 경우 java class프로그래밍 방식으로 사용할 수도 있습니다

 editText.setEnabled(false);

사용하려면 android : enabled = "true"사용
android_jain

8

간단히:

editText.setEnabled(false);

1
이전 답변과 질문이 어떻게 다릅니 까?
Onik

setFocusable (false)을 사용하면 OnClickListener를 설정할 수도 있습니다.
Oded Breiner

5

클래스에서 아래 속성을 설정하십시오.

editText.setFocusable(false);
editText.setEnabled(false);

필요에 따라 원활하게 작동합니다.


단지 enabled충분했다
ateebahmed

5

EditText의 기능을 비활성화하려면 다음을 사용하십시오.

EditText.setInputType(InputType.TYPE_NULL);

어떤 식 으로든 사용하려는 경우 다음을 사용할 수 있습니다.

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

inputType이 비밀번호 인 경우 어떻게해야합니까? TYPE_NULL은 비밀번호를 표시합니다.
ilyamuromets

4

당신이 사용하는 경우 android:editable="false" 하면 이클립스에서 "android : editable is deprecated : inputType을 대신 사용하십시오"라는 메시지를 상기시킵니다.

그래서 android:focusable="false"대신에 사용 하면 잘 작동합니다.


4
android:editable="false"

더 이상 사용되지 않으며 사용됩니다.

 YourEditText.setInputType(InputType.TYPE_NULL);

inputType이 비밀번호 인 경우 어떻게해야합니까? TYPE_NULL은 비밀번호를 표시합니다.
ilyamuromets

이 답변의 힘 도움말 @ilyamuromets stackoverflow.com/a/16720520/7704650TYPE_TEXT_VARIATION_PASSWORD팔로우를이 이상 developer.android.com/reference/android/text/InputType
emkarachchi

소프트 키보드가 열려 있고 사용자가 텍스트를 입력하려고 할 때 EditText에서 입력을 비활성화하고 싶습니다. InputType.TYPE_NULL은 isFocusable 및 isFocusableInTouchMode와 함께 false 값으로 작동합니다. 그러나 입력 필드의 inputType이 textPassword이면 InputType.TYPE_NULL은 비밀번호 값을 표시합니다. InputType.TYPE_NULL을 설정하면 | InputType.TYPE_TEXT_VARIATION_PASSWORD 그러면 비밀번호도 표시되며 사용자는 텍스트를 입력 할 수 있습니다.
ilyamuromets


3

편집 텍스트가 비활성화 됩니다.

editText.setEnabled(false);

그리고 이것을 사용함으로써

editText.setInputType(InputType.TYPE_NULL);

편집 텍스트가 소프트 키보드 를 표시하지 않게 하지만 실제 키보드에 연결되어 있으면 입력 할 수 있습니다.


inputType이 비밀번호 인 경우 어떻게해야합니까? TYPE_NULL은 비밀번호를 표시합니다.
ilyamuromets

3

비활성화 = FOCUS + CLICK + CURSOR

포커스, 클릭 및 커서 가시성을 비활성화하면 속임수가됩니다.

다음은 XML 코드입니다

<EditText
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:cursorVisible="false"
    android:clickable="false"
    />

2

Google에서 새로 출시 한 Material Design Library를 사용합니다. 내 경우에는 android : focusable = "false"및 android : cursorVisible = "false"를 사용할 때 작동합니다.

<com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/to_time_input_layout"
                    app:endIconMode="custom"
                    app:endIconDrawable="@drawable/ic_clock"
                    app:endIconContentDescription="ToTime"
                    app:endIconTint="@color/colorAccent"
                    style="@style/OutlinedEditTextStyle"
                    android:hint="To Time">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/to_time_edit_text"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="false"
                        android:cursorVisible="false" />

</com.google.android.material.textfield.TextInputLayout>

1

필자의 경우 EditText텍스트가 없으면 스크롤해야했습니다. maxLines비활성화되면 줄 수가 초과 됩니다. 이 구현은 나를 위해 완벽하게 작동했습니다.

private void setIsChatEditTextEditable(boolean value)
{
    if(value)
    {
        mEdittext.setCursorVisible(true);
        mEdittext.setSelection(chat_edittext.length());
       // use new EditText(getApplicationContext()).getKeyListener()) if required below
        mEdittext.setKeyListener(new AppCompatEditText(getApplicationContext()).getKeyListener());  
    }
    else
    {
        mEdittext.setCursorVisible(false);
        mEdittext.setKeyListener(null);
    }
}

1

이것을 사용해보십시오, 나를 위해 잘 작동합니다 :

public class CustomEdittext extends EditText {

Boolean mIsTextEditor=true;
public CustomEdittext(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
public boolean onCheckIsTextEditor() {
    // TODO Auto-generated method stub
    return mIsTextEditor;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    mIsTextEditor=false;
    Boolean mOnTouchEvent=super.onTouchEvent(event);
    mIsTextEditor=true;     
    return mOnTouchEvent;
} }

참고 : this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 활동 을 추가해야합니다. 그렇지 않으면 처음에 팝업 이 나타 keyboard납니다 .


1

일부 답변에서 언급했듯이 editText를 비활성화하면 회색이되고 포커스를 false로 설정하면 커서가 표시됩니다.

XML로만하고 싶다면이 트릭을 수행하십시오.

       <YourFloatLabel
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <EditText
                android:id="@+id/view_ads_search_select"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusable="true"
                android:clickable="true"/>  
       </YourFloatLabel>

간단히 EditText 위에 FrameLayout을 표시하고 editText를 클릭 할 수 없도록 포커스 가능하고 클릭 가능하게 설정하십시오.


0

이것은 나를 위해 작동합니다 :

android : focusable = "false"


2
Sampath Kumar가 4 년 전 게시 한 것과 다른 점은 무엇입니까?
gobrewers14

0

허용 된 답변에 대한 @Asymptote의 의견에서 다음을 사용하십시오.

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

... 그리고 밥은 삼촌입니다.


0

오늘은 여전히을 사용 editable="false"하지만focusable="false" .

EditText를 편집 할 수 없게 만들어야하는 경우는 EditText 스타일 (밑줄, 힌트 등)을 유지하려고하지만 텍스트 대신 다른 입력을 허용하기 때문입니다. 드롭 다운 목록을 예로들 수 있습니다.

이러한 사용 사례에서는 EditText클릭 할 수 있어야합니다 (따라서 enabled="false"적합하지 않음). focusable="false"그러나이 트릭을 설정 하면 EditText를 오랫동안 잡고 클립 보드에서 자신의 텍스트를 붙여 넣을 수 있습니다. . 코드와 처리에 따라 앱이 중단 될 수도 있습니다.

그래서 나는 또한 사용 editable="false"했고 이제 경고를 제외하고 모든 것이 훌륭합니다.


0

당신이 사용할 수있는 android:focusable="false" 있지만 커서를 비활성화해야합니다. 그렇지 않으면 복사 / 붙여 넣기 기능이 계속 작동합니다.

그래서 사용하십시오

android:focusable="false"
android:cursorVisible="false"

0

여러 수준의 장애인을 달성하는 방법은 여러 가지가 있습니다.

  • editText.setShowSoftInputOnFocus(false);editText.setFocusable

EditText일부 텍스트로 키보드를 표시 하지 못하도록합니다 . 그러나 커서는 여전히 표시되며 사용자는 일부 텍스트를 붙여 넣을 수 있습니다.

  • editText.setCursorVisible(false)

커서를 숨 깁니다. 왜 그렇게 하시겠습니까? 사용자는 텍스트를 입력하고 붙여 넣을 수 있습니다.

  • editText.setKeyListener(null)

이 방법이 가장 편리하다고 생각합니다. 사용자가 텍스트를 입력하는 방법은 없지만 사용자가 텍스트를 OnClickListener터치 할 때 작업을 트리거하려는 경우 위젯이 계속 작동 합니다.

  • editText.setEnabled(false);

완전히 비활성화합니다 EditText. 문자 그대로 '읽기 전용'이며 사용자는 텍스트를 입력 할 수 없으며 (예를 들어) OnClickListener 작동하지 않습니다 .

TextEdit 설명서


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