안드로이드에서 XML을 통해 EditText를 편집 할 수 없게 만드는 방법은 무엇입니까?


300

EditTextXML을 통해 편집 할 수 없는 방법을 알려주는 사람이 있습니까? 에 설정 android:editable을 시도 false했지만

  1. 더 이상 사용되지 않습니다. 과
  2. 작동하지 않았다.

6
편집 할 수없는 경우 왜 EditText가 필요합니까? 일반 TextView를 사용하면 충분하지 않습니까? 그리고 setEditable () 함수도 더 이상 사용되지 않습니까?
— kiki

4
나에게 이것은 내용에 대한 표준 복사 붙여 넣기를 가능하게하기 위해 의미가 있습니다. TextView를 사용하면 불가능합니다 (적어도 기본 동작은 아님)
— Ixx

1
수정 : 나쁜 생각입니다. 특정 상황에서보기를 편집 할 수있게되거나 복사 붙여 넣기 옵션이 더 이상 표시되지 않습니다. 다른 접근법을 찾을 것입니다.
— Ixx

11
필자의 경우 일련의 작업이 수행되는 동안 EditText를 일시적으로 비활성화 한 다음 작업이 끝나면 다시 활성화하려고합니다.
— Joe Plante

1
이 질문은 합법적 인 관심사에 관한 것입니다. EditText스타일 을 유지하고 스크롤을 허용 하려면 이 라이브러리UI.setReadOnly(myEditText, true) 에서 사용 하십시오 . 몇 가지 속성을 설정해야 합니다 . 소스 코드에서 확인할 수 있습니다 .
— caw

답변:


399

이 간단한 코드를 사용하십시오 :

textView.setKeyListener(null);

효과가있다.

편집 : KeyListener나중에 추가하려면 다음을 수행하십시오.

1 : 키 리스너를 태그로 설정 textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2 : 태그에서 키 리스너를 가져 와서 다시 설정하십시오. textView

textView.setKeyListener((KeyListener) textView.getTag());

30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); 나중에 textView.setKeyListener ((KeyListener) textView.getTag ())로 다시 설정하십시오.
— 토마스 디냥

@TomDignan 쉽게 그렇게 할 수 있습니다! 질문이 하나 있습니다. setFocusable()doc이 기본 구현이 변경되면 변경 될 수 있다고 말했기 때문에 KeyListener에 필요한 기본값을 변경합니다.
— Andy

afaik 아니오, 태그를 사용할 수 있어야합니다
— Thomas Dignan

안녕하세요 ur 제안이 도움이되었습니다 ..thanx
— user1387035

38
XML 을 통해 설정하는 것에 대한 질문은 왜 이것이 솔루션으로 표시됩니까?
— Denys Vitali

398

이것을 EditText xml 파일에 추가하십시오 :

<EditText ...
        android:clickable="false" 
        android:cursorVisible="false" 
        android:focusable="false" 
        android:focusableInTouchMode="false">
</EditText>

와 같은 효과를 android:editable="false"냅니다. 나를 위해 일했습니다, 그것이 당신에게도 효과가 있기를 바랍니다.


3
notes.setKeyListener (null); notes.setClickable (false); notes.setCursorVisible (false); notes.setFocusable (false); notes.setFocusableInTouchMode (false);
— Jack Franzen

3
XML로하고 싶다면 ...와 TextView의 차이점은 무엇입니까 ???
— Chris Sim

11
차이점은 다음과 함께 사용할 수 있습니다TextInputLayout
— ahmadalibaloch

2
질문에서 요청한 순수한 XML 솔루션이므로 솔루션으로 표시해야합니다.
— zgc7009

2
이 기능은 더 이상 사용되지 않습니다 (2018 년 10 월)
— Sebastian Paduano

54

편집 텍스트를 보자

EditText editText;

editText.setKeyListener(null);

작동하지만 키를 듣지 않습니다.

사용자는 편집 텍스트에서 커서를 볼 수 있습니다.

당신은 시도 할 수 있습니다 editText.setEnabled(false);

이는 사용자가 커서를 볼 수 없음을 의미합니다. 간단히 말해서 TextView.


3
EditText는 TextView의 하위 클래스이므로 정확합니다. 그러나 textText 대신 editText를 변수로 사용하십시오.
— Joe Plante

@JoePlante 건설적인 의견 덕분에 변수 이름이 변경되었습니다.
— Mahendran

이것은 EditText를 흐리게 표시합니다
— stephen

회색 EditText는 비활성화되어 사용자가 편집 할 수 없음을 나타냅니다.
— Mahendran

색상을 설정하고 회색으로 표시되는 것을 방지합니다. XML : android : textColor = "@ color / Black"android : enabled = "false"
— 레드 와인

32

다른 답변에서 언급했듯이 할 수는 setEnabled(false) 있지만 XML을 통해 설정하는 방법을 묻는 이유는 다음과 같습니다.

에 다음 속성을 추가하십시오 EditText.

android:enabled="false"

4
OP 질문에 대한 정확한 답변.
— SMR

그러나이 방법은 더 이상 사용되지 않습니다
— Lalit kumar

2
@Lalitkumar enabled는 더 이상 사용되지 않습니다. editable입니다.
— InsanityOnABun

7
활성화하면 클릭 리스너에도 액세스 할 수 없습니다. 그래서 저에게는 답이 아닙니다.
— Naveed Ahmad

이것은 텍스트 숨기기 :(
— Chego

24

XML에서 비활성화 (한 줄) :

 android:focusable="false"

필요한 경우 Java에서 다시 활성화하십시오 (한 줄).

editText.setFocusableInTouchMode(true);

좋은 답변입니다. 이 방법으로 editText.setText ( "your text")를 사용하여 editText 값을 계속 설정할 수 있습니다. 그러나 사용자는 편집 할 수 없습니다.
— Prakash

17

그들은 "편집 가능"을 더 이상 사용하지 않지만 inputType에서 작동하는 것을 제공하지 않았습니다.

그런데 inputType = "none"은 어떤 영향을 미칩니 까? 내가 사용하는 한 그것을 사용하거나 사용하지 않으면 아무런 차이가 없습니다.

예를 들어, 기본 editText는 한 줄이라고합니다. 그러나 inputType을 한 줄로 선택해야합니다. "없음"을 선택하면 여전히 여러 줄로 표시됩니다.


1
그것은에 차이가되지 않습니다 모든 이 장치를하지만, 해야 워드 프로세서에 따르면 : developer.android.com/reference/android/widget/...
— 까악 까악

12
구글 혼란의 아름다운 예
— Yar

14

이 조합은 저에게 효과적이었습니다.

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>

13

당신이 언급 한대로 android : editable은 더 이상 사용되지 않습니다. 대신 android : inputType = "none"을 사용해야하지만 버그로 인해 작동하지 않습니다 ( https://code.google.com/p/android/issues/detail?id=2854 )

그러나 포커스 가능을 사용하여 동일한 것을 달성 할 수 있습니다.

XML을 통해 :

<EditText ...
        android:focusable="false" 
</EditText>

코드에서 :

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);

구글의 의례, 버그는 두 가지 다른 시나리오에 빠질 것입니다 : 1.) 그것은 수정되지만 6 년 후에 2.) 그것은 결코 수정되지 않을 것이며, 그들은 새로운 버전의 Android를 개발할 것입니다.
— 네온 전쟁 27

12

클릭하고 싶지만 편집하고 싶지 않은 경우 다음을 시도하십시오.

        android:focusable="false"

8

그냥 사용하십시오 android:enabled="false". 이렇게하면 EditText편집 할 수없는 것처럼 보이게됩니다.


7
<EditText
    android:id="@+id/txtDate"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="2dp"
    android:clickable="false"
    android:cursorVisible="false"
    android:gravity="center" />

다음을 사용하십시오.

txtDate.setKeyListener(null);

7

자바 코드로 수행하려면이 줄을 사용하여 비활성화하십시오.

editText.setEnabled(false);

그리고 이것은 그것을 가능하게합니다 :

editText.setEnabled(true);

5

나는 노력했다 :

textView.setInputType( InputType.TYPE_NULL );

어느 것이 효과가 있지만 나에게는 그렇지 않았습니다.

이 코드로 끝냈습니다 :

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

완벽하게 작동합니다.


4

활동이 EditText에 집중하지 않고 클릭 할 때 키보드를 표시하지 않으려는 경우 이것이 나를 위해 일한 것입니다.

기본 레이아웃에 속성 추가

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

그런 다음 EditText 필드

android:focusable="false"
android:focusableInTouchMode="false"

예를 들면 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_home"
    android:background="@drawable/bg_landing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    tools:context="com.woppi.woppi.samplelapp.HomeActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/fromEditText"
        android:layout_weight="1"
        android:hint="@string/placeholder_choose_language"
        android:textColor="@android:color/white"
        android:textColorHint="@android:color/darker_gray"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:onClick="onSelectFromLanguage" />

</RelativeLayout>

3

@mahe madi 외에도 이것을 시도해 볼 수 있습니다

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

이 방법은 커서를 숨기고 초점을 잃으며 TextView와 같이 동작하는 텍스트 색상을 검정색으로 설정합니다.

그리고 editText로 되돌리려면 간단히 EditText의 모든 속성을 얻습니다.

editText.setEnabled(true);

그것이 도움이되기를 바랍니다 :)


3

사용할 수는 android:editable="false"있지만 setEnabled(false)컨트롤을 편집 할 수 없다는 시각적 힌트를 사용자에게 제공하므로 사용 하는 것이 좋습니다. 비활성화 된 모든 위젯에서 동일한 시각적 큐를 사용하며 일관성이 우수합니다.


3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

"longClickable"속성은 "붙여 넣기"및 "모두 선택"옵션이 툴팁으로 표시되는 길게 누르기 동작을 비활성화합니다.


2

나는 다음을 시도했다.

codeEditText.setInputType(InputType.TYPE_NULL);

this.codeEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

  @Override
  public void onFocusChange(View v, boolean hasFocus) {

    if (hasFocus) {

      pickCode();

    }

  }

});
this.codeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickCode();

  }

});

그러나 문제는 편집 텍스트가 양식의 첫 번째 텍스트 인 경우 포커스를 얻고 새로운 활동을 시작하는 pickCode () 코드가 바로 호출된다는 것입니다. 그래서 코드를 다음과 같이 수정했으며 꽤 잘 작동하는 것 같습니다 (텍스트 편집에 초점을 맞출 수는 없지만 필요하지는 않습니다).

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

친애하는,

댓글 환영합니다

존 고체


1
잘 작동하는 것 같지만 EditText와 같은 TextView를 사용하는 것이 쉽지 않습니다 (: style = "@ android : style / Widget.EditText"사용)?
— 안드로이드 개발자

2

EditText.setFocusable(false)편집하려면 다시 사용 하고 true로 설정하십시오.



2

이 방법은 나를 위해 일을했습니다. 선택하고 클립 보드에 복사 할 수는 있지만 수정하거나 붙여 넣을 수는 없습니다.

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"

1

android : editable 은 더 이상 사용되지 않으므로 inputType을 대신 사용하십시오.

   <EditText
        android:id="@+id/editText_x"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="70"
        android:inputType="none"
        android:hint="@string/enter_x" />

android : inputType = "none"은 android : editable과 많이 다릅니다. 직접 시도해보십시오!
— Denys Vitali

EditText를 편집 불가능하게 만들려면 EditText를 사용하는 것이 무의미 해 보이기 때문에 EditText 대신 TextView 위젯을 사용하는 것이 좋습니다.
— M-Razavi

귀하의 제안은 PopupWindow가있는 EditText에는 적용되지 않습니다 . 문제를 더 잘 이해하려면 이 이미지 를 참조하십시오 . 이 예제에서는 EditText의 모양을 원하지만 사용자가 팝업 창만으로 값을 변경하게하려면 "잠그십시오". 더 많은 동기 부여를 보려면 이 문제 를 확인하십시오. 2009 년 이래로 문제가되었습니다.
— Denys Vitali

1

나는 같은 문제에 직면했지만 관찰 후 입력 android:editable="false"텍스트 ( android:inputType="ANY_VALUE")가 Edittext에 제공 되지 않은 경우에만 작동 한다는 것을 알았습니다.

EditText에서 inputType을 제거하고 잘 작동하는 editable = false를 사용하십시오.


0

나는 이것을 대화 상자로 해결합니다.

    AlertDialog dialog;
    EditText _editID;
    TextView _txtID;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        _txtID = (TextView) findViewById(R.id._txtID);
        dialog = new AlertDialog.Builder(this).create();
        _editID = new EditText(this);
        _editID.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
        dialog.setTitle("Numero do Registro:");
        dialog.setView(_editID);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "IR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                _txtID.setText(_editID.getText());
                toId(Integer.parseInt((_editID.getText().toString())));
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCELAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        _txtID.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _txtID.setText("_editID.getText()");
                //_editID.setText("");
                dialog.show();

            }
        });

0

짧은 대답 : 나는 그것을 사용 android:focusable="false"했다. 클릭 청취도 지금 작동합니다.



-10

이 코드를 사용해보십시오. 내 프로젝트에서 작동하므로 프로젝트에서 작동합니다.

android:editable="false"

2
이것이 작동하지 않으며 감가 상각 방법을 사용하는 것이 권장되지 않음을 확인할 수 있습니다.
— Adorjan Princz

1
android : editable은 필드를 클릭 할 수는 있지만 편집 할 수 없도록하려면 (즉, 클릭 한 후 대화 상자를 열려면) 실제로 최상의 솔루션입니다.
— Yar

그것은 당신의 프로젝트에서 작동하기 때문에 우리의 것이 아닙니다. 아주 나쁜 생각.
— Neon Warge
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.