안드로이드에서 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.