EditText를 읽기 전용으로 설정


119

읽기 전용 EditText보기 를 만들고 싶습니다 . 이 코드를 수행하는 XML은으로 보이지만 android:editable="false"코드에서이 작업을 수행하고 싶습니다.

어떻게 할 수 있습니까?



3
에서 android:editable더 이상 사용되지 않는 것도 주목할 가치가 있습니다 EditText.
Derek W

가장 신뢰할 수있는 방법 UI.setReadOnly(myEditText, true)이 라이브러리 에서 사용 하는 입니다. 설정해야 할 몇 가지 속성이 있으며 소스 코드에서 확인할 수 있습니다 .
caw

3
네, 데릭이 맞습니다. 이제 XML에 당신은 사용해야 android:inputType="none"하고android:textIsSelectable="true"
아툴

답변:


135

이 코드를 사용하십시오 ..

Edittext.setEnabled(false);

34
이것은 읽기 전용으로 '설정'될뿐만 아니라 스크롤 및 복사도 비활성화합니다. :-(
josef

1
이것은 비활성화됩니다. 특히 여러 줄의 EditText에는 쓸모가 없습니다.
Atul

이것을 시도하지만 가치를 잃었습니까?
fdurmus77

97

당신이 경우 setEnabled(false)다음은 editText(회색 등) 비활성화 보일 것이다. 편집기의 시각적 측면을 변경하고 싶지 않을 수 있습니다.

덜 방해하는 방법은 setFocusable(false).

나는 이것이 당신의 질문에 당신의 초기 의도에 더 가깝다고 생각합니다.


8
이것은 좋지만 사용자는 여전히 텍스트 필드에 "붙여 넣기"를 할 수 있습니다.
xtrem

14
이것은 나를 위해 잘 작동했습니다. 클릭 할 수 있어야했기 때문에 setEnabled (false)를 사용할 수 없었습니다. 붙여 넣기 가능한 문제를 해결하기 위해 방금 android : longClickable = "false"
dt0을 수행

3
당신이 사용하는 경우 setFocusable(false)(심지어 setFocusableInTouchMode(false)함께 setClickable(false)) 당신은 여전히 당신의 가치 변경할 수 있습니다 editText당신을 눌러 editTextA에 대한 몇 백 밀리 초 및 선택 Paste하지 않는 옵션을 시스템 클립 보드가 비어 있습니다. 23 인 최신 API로 테스트했습니다 .
patryk.beza

이것은 작동하고 스크롤 할 수 있고 커서를 볼 수 없습니다.
live-love

28

XML사용 :

android:editable="false"

예로서:

<EditText
    android:id="@+id/EditText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:editable="false" />

에 따르면 자바 독editable속성은 (적어도이 아닌 API 레벨 23로) 사용되지 않는 것으로 나타났습니다하지 않습니다.
그렉 브라운

8
@MichelJung이 맞습니다. 당신은 사용해야합니다android:inputType="none"
Ata

1
이 질문은 XML이 아닌 Java 코드를 통해 편집 가능하게 만드는 방법을 모색합니다!
saeed khalafinejad

7
나는 노력 android:inputType="none"하고 있으며 데이터는 여전히 편집 가능합니다.
BlueMonkMN

24

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

EditText.setKeyListener(null);

5
이것은 좋았 겠지만 사용자는 여전히 필드에 "붙여 넣기"를 할 수 있습니다. 이것이 해킹처럼 보이지만 어쨌든 엄지 손가락을 치십시오. 나는 그들이 setEditable () API를 가지고 있기를 바랍니다.
xtrem

15

TextView대신 사용하는 것이 가장 좋습니다 .


8
그의 앱 흐름에 따라 어떤 때는 편집 가능하도록 만들어야 할 수도 있고 그렇지 않은 경우도있을 수 있습니다.
Muhammed Refaat

15
editText.setInputType(InputType.TYPE_NULL);

당으로 문서 이 표시되는 소프트 키보드를 방지 할 수 있습니다. 또한 붙여 넣기를 방지하고 스크롤을 허용하며 뷰의 시각적 측면을 변경하지 않습니다. 그러나 이것은 또한보기 내에서 텍스트를 선택하고 복사하는 것을 방지합니다.

내 테스트 설정에서 setInputTypeTYPE_NULL감가 상각 동일한 기능을 것으로 보인다 android:editable="false". 또한 android:inputType="none"눈에 띄는 효과가없는 것 같습니다.


동의합니다. 지금은 작동하며 말씀하신대로 android:inputType="none"더 이상 작동하지 않습니다.
Goke Obasa

1
불행히도 이것은 가상 키보드가 이미 열려있는 경우 필드에 입력하는 것을 방지하지 않습니다 (즉, 사용자가 편집 가능한 필드를 먼저 탭한 다음이 필드를 탭하면 가상 키보드가 닫히지 않음). 또한 외부 키보드에서 필드에 입력하는 것을 방지하지 않습니다.
jk7 2017-04-25

11

android : editable = "false" 는 더 이상 사용되지 않습니다. 따라서 편집 텍스트를 읽기 전용으로 만드는 데 사용할 수 없습니다.

나는 벨로우즈 솔루션을 사용하여 이것을했다. 여기에서 사용했습니다

android : inputType = "none"

android : textIsSelectable = "true"

android : focusable = "false"

시도해보십시오 :)

<EditText
         android:id="@+id/et_newsgpa_university"
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
         android:hint="@string/hint_educational_institute"
         android:textSize="@dimen/regular_text"
         android:inputType="none"
         android:textIsSelectable="true"
         android:focusable="false"
         android:maxLines="1"
         android:imeOptions="actionNext"/>

실제로 읽기 전용이 아니므로이 코드에서 텍스트를 편집하기 위해 값을 붙여 넣을 수 있습니다. android:enabled="false"좋은 대안이 될 수 있습니다.
eVader

7
editText.setEnabled(false);
editText.setFilters(new InputFilter[] { new InputFilter() {
    public CharSequence filter(CharSequence src, int start, int end,
            Spanned dst, int dstart, int dend) {
        return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
    }
} });

편집 할 수없는 EditText 필터를 제공합니다. 먼저 editText 필드에 원하는 텍스트를 입력 한 다음이 필터를 적용해야합니다.


2
좋은 솔루션이며 TextWatcher보다 코드 줄이 적습니다. 이를 통해 사용자는 텍스트를 선택 및 복사 할 수 있지만 타이핑이나 잘라 내기 또는 붙여 넣기로 텍스트를 변경할 수는 없습니다. return 문은 다음과 같이 단순화 할 수 있습니다return dst.subSequence(dstart, dend);
jk7

내 이전 의견은 EditText 필드를 비활성화하지 않고 setFilters () 문만 언급했습니다.
jk7

감사합니다. 이것이 저에게 적합한 유일한 솔루션입니다! 작동중인 항목이 감가 상각되어 여전히 작동하지 않는 항목 (inputType = "none") 및 원치 않는 부작용 (여러 줄 입력)으로 대체되어 실망 스럽습니다. @ jk7이 제안한 변경 사항은 중요합니다. 원래 return 문을 사용하여 원본 텍스트의 일부를 선택하고 무언가를 입력하면 선택한 텍스트가 필터에서 반환 된 빈 문자열로 바뀌기 때문입니다. 이 경우 src 길이는 0이 아니고 빈 문자열이 적용됩니다.
Paul L

6

이 두 줄을 쓰는 것만으로도 충분합니다.

yourEditText.setKeyListener(null); 
yourEditText.setEnabled(false);

리스너를 비활성화하는 것보다 null을 설정하는 것이 훨씬 더 유용합니다.
Humberto Castañeda


3

사용해보십시오

editText.setEnabled(false);
editText.setClickable(false);

이것은 여전히 키보드 탭을 쳐서 포커스가 될 수 있습니다
AlanKley

3
android:editable

설정된 경우 TextView입력 방법 이 있음 을 지정합니다 . 달리 지정하지 않는 한 텍스트 형식입니다. 의 경우 TextView기본적으로 false입니다. 의 경우 EditText기본적으로 true입니다.

또는 boolean값 이어야합니다 .truefalse

이 유형의 값을 포함하는 자원 (양식 @[package:]type:name) 또는 테마 속성 ( 양식 ) 에 대한 참조 일 수도 있습니다 ?[package:][type:]name.

이것은 편집 가능한 전역 속성 자원 기호에 해당합니다.

관련 방법


2

컨텍스트 메뉴를 제거하려면 편집 텍스트의 onLongClick 리스너를 재정의하십시오.

EditText myTextField = (EditText)findViewById(R.id.my_edit_text_id);
myTextField.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        return true;
    }
});

3
나는 android : editable = "false"및 android : focusable = "false"를 사용한 다음 onLongclick을 재정의하고 원하는 결과를 얻었습니다
JannGabriel

2

이 코드를 사용하십시오.

editText.setEnabled(false);
editText.setTextColor(ContextCompat.getColor(context, R.color.black);

비활성화 editText하면 읽기 전용 모양과 동작이 제공되지만 text-color을 회색으로 변경 하므로 텍스트 색상을 설정해야합니다.


또한 몇 가지 설명을 추가하십시오.
BlackBeard

1

이것이 제 구현입니다 (약간 길지만 유용합니다!) :이 코드를 사용하여 EditView를 읽기 전용 또는 일반으로 만들 수 있습니다. 읽기 전용 상태에서도 사용자가 텍스트를 복사 할 수 있습니다. 일반 EditText와 다르게 보이도록 배경을 변경할 수 있습니다.

public static TextWatcher setReadOnly(final EditText edt, final boolean readOnlyState, TextWatcher remove) {
    edt.setCursorVisible(!readOnlyState);
    TextWatcher tw = null;
    final String text = edt.getText().toString();
    if (readOnlyState) {
            tw = new TextWatcher();

            @Override
            public void afterTextChanged(Editable s) {

            }
            @Override
            //saving the text before change
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            // and replace it with content if it is about to change
            public void onTextChanged(CharSequence s, int start,int before, int count) {
                edt.removeTextChangedListener(this);
                edt.setText(text);
                edt.addTextChangedListener(this);
            }
        };
        edt.addTextChangedListener(tw);
        return tw;
    } else {
        edt.removeTextChangedListener(remove);
        return remove;
    }
}

이 코드의 장점은 EditText가 일반 EditText로 표시되지만 내용을 변경할 수 없다는 것입니다. 반환 값은 읽기 전용 상태에서 정상 상태로 되돌릴 수 있도록 변수로 유지되어야합니다.

EditText를 읽기 전용으로 만들려면 다음과 같이 입력하십시오.

TextWatcher tw = setReadOnly(editText, true, null);

그리고 이전 문장에서 tw를 정상적으로 사용하려면 :

setReadOnly(editText, false, tw);

1

이것은 위의 몇 가지 제안을 고려하여 저에게 효과적이었습니다. TextEdit를 포커스 가능하게 만들지 만 사용자가 클릭하거나 포커스를 맞추면 PopupWindow에 선택 목록이 표시됩니다. (이상한 Spinner 위젯을 대체하고 있습니다). TextEdit xml은 매우 일반적입니다 ...

public void onCreate(Bundle savedInstanceState) {
    ....  
    fEditState = (EditText) findViewById(R.id.state_edit);

    fEditState.setLongClickable(false);
    fEditState.setKeyListener(null);
    fEditState.setFocusable(true);

    fEditState.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus)
        {
            if (hasFocus)
            {
               showStatesPopup();

            }
        }
    });

    fEditState.setOnClickListener(new Button.OnClickListener(){

        public void onClick(View arg0)
        {
           showStatesPopup();
        }
    });
    ....
}

private void showStatesPopup()
{
    // fPopupWindowStates instantiated in OnCreate()

    if (!fPopupWindowStates.isShowing()) {
        // show the list view as dropdown
        fPopupWindowStates.showAsDropDown(fEditState, -5, 0);
    }
}  

1

방금 컨트롤에서 텍스트를 복사 할 수 있지만, 당신이 사용할 수있는 편집 할 수 없습니다하려면 텍스트 뷰를 대신하고 설정 텍스트 입니다 선택 .

암호:

myTextView.setTextIsSelectable(true);
myTextView.setFocusable(true);
myTextView.setFocusableInTouchMode(true);
// myTextView.setSelectAllOnFocus(true);

xml :

<TextView
    android:textIsSelectable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"     
    ...
/>
<!--android:selectAllOnFocus="true"-->


setTextIsSelectable 의 문서 는 다음 과 같이 말합니다.

이 메서드를 호출하여 textIsSelectable 값을 설정하면 focusable, focusableInTouchMode, clickable 및 longClickable 플래그를 동일한 값으로 설정합니다.

그러나 터치 입력과 함께 작동하려면 focusable 및 focusableInTouchMode를 명시 적으로 true로 설정해야했습니다.


1

이것은 나에게 유일한 완전한 간단한 해결책이었습니다.

editText.setEnabled(false);   // Prevents data entry
editText.setFocusable(false); // Prevents being able to tab to it from keyboard

0

다음을 사용하여 EditTextPreference를 읽기 전용으로 만드는 데 문제가 없었습니다.

editTextPref.setSelectable(false);

이는 '요약'필드를 사용하여 읽기 전용 필드를 표시하는 것과 함께 사용할 때 잘 작동합니다 (예 : 계정 정보를 표시하는 데 유용함). http://gmariotti.blogspot.com/2013/01/preferenceactivity-preferencefragment.html 에서 동적으로 가져온 요약 필드 업데이트

private static final List<String> keyList;

static {
    keyList = new ArrayList<String>();
    keyList.add("field1");
    keyList.add("field2");
    keyList.add("field3");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

    for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){
        initSummary(getPreferenceScreen().getPreference(i));
    }
}

private void initSummary(Preference p) {
    if (p instanceof PreferenceCategory) {
        PreferenceCategory pCat = (PreferenceCategory) p;
        for (int i = 0; i < pCat.getPreferenceCount(); i++) {
            initSummary(pCat.getPreference(i));
        }
    } else {
        updatePrefSummary(p);
    }
}

private void updatePrefSummary(Preference p) {
    if (p instanceof ListPreference) {
        ListPreference listPref = (ListPreference) p;
        p.setSummary(listPref.getEntry());
    }
    if (p instanceof EditTextPreference) {
        EditTextPreference editTextPref = (EditTextPreference) p;
        //editTextPref.setEnabled(false); // this can be used to 'gray out' as well
        editTextPref.setSelectable(false);
        if (keyList.contains(p.getKey())) {
            p.setSummary(editTextPref.getText());
        }
    }
}

0

EdiTextView xml 파일에서 설정하십시오.

android:focusable="false"

1
이 질문은 XML이 아닌 프로그래밍 방식으로 읽기 전용으로 만드는 방법을 묻습니다.
jk7 2017-04-24

0

으로 android:editable=""사용되지 않으며

설정

  • android:clickable="false"
  • android:focusable="false"
  • android:inputType="none"
  • android:cursorVisible="false"

"읽기 전용"으로 만듭니다.

그러나 사용자는 여전히 필드에 붙여 넣거나 다른 긴 클릭 작업을 수행 할 수 있습니다. 이를 비활성화하려면 onLongClickListener ()를 재정의하면됩니다.
Kotlin에서 :

  • myEditText.setOnLongClickListener { true }

충분합니다.


0

이에 대한 나의 접근 방식은 다음과 같이 사용자 지정 TextWatcher 클래스를 만드는 것입니다.

class ReadOnlyTextWatcher implements TextWatcher {
    private final EditText textEdit;
    private String originalText;
    private boolean mustUndo = true;

    public ReadOnlyTextWatcher(EditText textEdit) {
        this.textEdit = textEdit;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if (mustUndo) {
            originalText = charSequence.toString();
        }
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (mustUndo) {
            mustUndo = false;
            textEdit.setText(originalText);
        } else {
            mustUndo = true;
        }
    }
}

그런 다음 활성화 된 상태에서도 읽기 전용으로 설정하려는 모든 필드에 해당 감시자를 추가합니다.

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