문제

레이아웃에서 설정할 수 있습니다 EditText 위젯을 통해 편집 할 수 없습니다 android:editable attribute.

코드로 어떻게 할 수 있습니까? 나는 만들어야한다 EditText 조건에 따라 편집 할 수있는 위젯.

도움이 되었습니까?

해결책

나는 생각한다 InputFilter 모든 변경 사항을 거부하는 것은 좋은 해결책입니다.

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) : "";
        }
    }
});

편집하다: Dlazar는 (아래)를 변경할 것을 제안했습니다 return 에게 dst.subSequence(dstart, dend) 단어를 제거하는 행동을 극복합니다.

다른 팁

editText.setFocusable(false);
editText.setClickable(false);

이것은 보장합니다 EditText 제어를 선택하고 집중할 수 없으므로 편집 할 수 없습니다.

나는 이것을 직접 시도했다.

편집 텍스트를 비활성화하려면 :

.setFocusable(false);

이것은 또한 setFocusableInTouchMode를 False로 설정합니다!

편집 텍스트를 활성화하려면 :

setFocusableInTouchMode(true);

이것은 또한 setfocusable을 true로 설정합니다.

이 작업을 수행하는 가장 좋은 방법은이 단일 코드 라인을 사용하는 것입니다.

textView.setKeyListener(null);

문서는이 방법에 대해 다음과 같이 말합니다.

이 텍스트 뷰에서 사용할 키 리스너를 설정합니다. 이것은 사용자 입력을 허용하지 않아도 될 수 있습니다.

android:editable="false" 
android:inputType="none" 

XML 또는

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);

또는

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);

당신은 이것을 시도 할 수 있습니다 :

        mEditText.setFocusable(false);
        mEditText.setClickable(false);
        mEditText.setFocusableInTouchMode(false);
        mEditText.setLongClickable(false);
        mEditText.setInputType(InputType.TYPE_NULL);

이렇게하면 EditText가 완전히 비활성화되고 사용자가 텍스트 편집 옵션을 열지 않으려면 긴 누르기를 비활성화합니다.

EditText 클래스에서 해당 속성과 관련된 방법이 표시되지 않습니다. 그러나 당신이 사용할 수있는 다른 유사한 것들이 있습니다.android:focus/setFocusable(boolean) 또는 다른 TextView를 만듭니다android:editable="false" 그리고 사용 setVisiblilty() 편집 가능한 뷰가 아닌 편집 가능한 뷰 사이를 전환합니다. 사용하는 경우 View.GONE 사용자는 두 개의 edittexts가 있다는 것을 결코 알지 못할 것입니다.

당신의 느낌이 야심적이라면 아마도 edittext 's와 함께 무언가를 할 수 있습니다. onTextChanged 청취자는 그것을 반응하는 것을 좋아합니다 setText.

Josef의 답변에 대해 언급 할 수 없기 때문에 새로운 답변을 게시합니다.

입력 필터는 잘 작동하지만 미묘한 버그가 있습니다. 선택을 입력하면 모든 텍스트가 삭제됩니다.

예를 들어, 텍스트가 있다고 가정 해보십시오 "foo" 에서 EditText. 모든 것을 선택한 경우 (예 : 두 번 클릭하여) 'a', 텍스트가 사라집니다. 이거 때문입니다 InputFilter 다음으로 호출됩니다.

filter("a", 0, 1, "foo", 0, 3);

제안 된 입력 필터는이 경우 빈 문자열을 반환합니다 (왜냐하면 src.length() < 1 ~이다 false), 누락 된 텍스트를 설명합니다.

해결책은 단순히 돌아 오는 것입니다 dst.subSequence(dstart, dend) 필터 기능에서. 이것은 삭제에도 잘 작동합니다.

당신은 시도 했습니까? setText (java.lang.charedence, android.widget.textView.BufferType) ? 다음과 같이 설명됩니다.

이 TextView가 표시하는 텍스트를 설정하고 (setText (charSequence) 참조) 및 스타일/스팬 가능한 버퍼에 저장되어 있는지 여부도 설정합니다. 그리고 편집 가능한지 여부.

(강조 광산)

나는 추측한다

Edittext.setEnabled(false); 

코드를 통해

그리고

android:enabled="false"

XML을 통해이 게시물을 확인하십시오 그래서.

그들은 작동해야하며 프로그래밍 방식으로 다시 활성화 할 수 있습니다 Edittext.setEnabled(true);

또한 새로운 EditView 인스턴스를 작성하는 경우 잘 작동하는 대체 솔루션을 지적하고 싶었습니다. 문서에서 제안한대로 getDefaultEdable () 메소드를 거짓을 반환 할 수 있습니다. 예를 들어

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};

이 시나리오에서 찾은 유일한 솔루션은 2 개의 레이아웃을 만드는 것입니다. 하나는 편집 가능하고 하나는 그렇지 않습니다. 다양한 조건에 따라 2 개 이상의 레이아웃을 만들어야 할 수도 있습니다. 조건을 공유 차가 또는 기타 수단에 저장하고 활동을 다시 시작한 후 조건에 따라 관련 레이아웃을로드하십시오. 예는 다음과 같습니다.

활동의 oncreate ()에서 :

    configuration = new Configuration(this.getSharedPreferences(Configuration.SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE));
    manualSettingsMode = configuration.isManualSettingsMode();
    if(manualSettingsMode){
        setContentView(R.layout.editableconfigurationsettings);
    }else {
        setContentView(R.layout.configurationsettings);
    }

활동은 조건 테스트 및 호출 함수에 따라 다음과 같이 다시 시작할 수 있습니다.

private void setManualEditing(){
    configuration.set_isManualSettingsMode(true);
    this.recreate();
}

private void setAutoEditing(){
    configuration.set_isManualSettingsMode(false);
    this.recreate();
}

도움이 되었기를 바랍니다. 더 나은 솔루션이 있어야하지만 이것이 제가하고있는 일입니다. 이상적으로는 개별 필드에서이를 수행 할 수 있으며 활동 / 레이아웃을 다시로드 할 필요가 없습니다. -순경

원하는 효과를 달성하는 올바른 방법은 다음과 같습니다.

mEditView.setText("my text", BufferType.NORMAL);

편집 가능한 것과 비 편집 가능한 사이를 전환하려면 다음을 수행 할 수 있습니다.

// Switch to non-editable
mEditView.setText(mEditView.getText(), BufferType.NORMAL);

// Switch back to editable
mEditView.setText(mEditView.getText(), BufferType.EDITABLE);

이 시도:

 mEditText.setFilters(new InputFilter[]{new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (XXX) {
                return "";
            } else {
                return null;
            }
        }
    }});
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top