안드로이드를 복제하는 방법 : 코드에서 editable = "false"?
-
20-08-2019 - |
문제
레이아웃에서 설정할 수 있습니다 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;
}
}
}});