EditText에서 Enter 키를 방지하지만 텍스트는 여러 줄로 표시됩니다.
사용자가 여러 줄로 된 텍스트를 입력 할 수 없지만 디스플레이가 여전히 여러 줄로 표시되도록 Android에서 EditText를 만들려면 어떻게해야합니까 (예 : 오른쪽으로가는 텍스트 대신 단어 줄 바꿈이 있음)?
새 줄을 입력 할 수 없지만 텍스트가 여러 줄로 표시되는 내장 SMS 응용 프로그램과 비슷합니다.
키를 차단하기 위해 위젯을 하위 클래스로 만들고 키 이벤트 처리를 재정의합니다 Enter
.
class MyTextView extends EditText
{
...
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode==KeyEvent.KEYCODE_ENTER)
{
// Just ignore the [Enter] key
return true;
}
// Handle all other keys in the default way
return super.onKeyDown(keyCode, event);
}
}
이것은 EditText 클래스를 재정의 할 필요가없는 메서드입니다. 새 줄을 잡아서 빈 문자열로 바꿉니다.
myEditTextObject.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
for(int i = s.length(); i > 0; i--) {
if(s.subSequence(i-1, i).toString().equals("\n"))
s.replace(i-1, i, "");
}
String myTextString = s.toString();
}
});
XML의 속성
android:lines="5"
android:inputType="textPersonName"
이것은 나를 위해 작동합니다.
<EditText
android:inputType="textShortMessage|textMultiLine"
android:minLines="3"
... />
Enter 키 대신 웃는 얼굴로 표시됩니다.
@Andreas Rudolph가 제공 한 답변에는 심각한 버그가 포함되어 있으므로 사용해서는 안됩니다. 이 코드는 여러 개행 문자를 포함하는 IndexOutOfBoundsException
내부 텍스트를 지나칠 때 발생합니다 EditText
. 이것은 사용되는 루프의 유형에 의해 발생하며, Editable
객체는 afterTextChanged
내용이 변경 (대체, 삭제, 삽입)하자마자 메서드를 호출합니다 .
올바른 코드 :
edittext.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
/*
* The loop is in reverse for a purpose,
* each replace or delete call on the Editable will cause
* the afterTextChanged method to be called again.
* Hence the return statement after the first removal.
* http://developer.android.com/reference/android/text/TextWatcher.html#afterTextChanged(android.text.Editable)
*/
for(int i = s.length()-1; i >= 0; i--){
if(s.charAt(i) == '\n'){
s.delete(i, i + 1);
return;
}
}
}
});
나는 이것을 테스트하고 있으며 작동하는 것 같습니다.
EditText editText = new EditText(context);
editText.setSingleLine(false);
editText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT);
이 시도:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER)
{
//Nothing
return true;
}
return super.onKeyDown(keyCode, event);
}
다음과 같이 xml에서 설정할 수 있습니다.
android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="10"
잊지 마세요 android:inputType="text"
. 설정하지 않으면 작동하지 않습니다. 그래도 이유를 모르겠습니다. 또한 maxLines
선호하는 값 으로 변경 하는 것을 잊지 마십시오 .
간단히 추가
android:singleLine="true"
당신의 EditText에
다음은 IME 키보드에 Enter 키를 표시하지 않는 정답입니다.
// IMPORTANT, do this before any of the code following it
myEditText.setSingleLine(true);
// IMPORTANT, to allow wrapping
myEditText.setHorizontallyScrolling(false);
// IMPORTANT, or else your edit text would wrap but not expand to multiple lines
myEditText.setMaxLines(6);
또한 XML 레이아웃 파일 setSingleLine(true)
의 명시 적 android:inputType
또는 setInputType(InputType.*)
코드에서 대체 할 수 있습니다. 사용 된 입력 유형은 입력을 한 줄로만 제한하는 것입니다 (즉, setSingleLine(true)
이미 암시 적으로 호출하는 모든 것 ).
설명:
어떤 setSingleLine(true)
일은 호출 setHorizontallyScrolling(true)
하고 setLines(1)
(가) 키를 입력하지 않으려면 일부 IME 키보드 설정을 변경과 함께, 암시.
차례로 호출 setLines(1)
은 호출 setMinLines(1)
과 setMaxLines(1)
하나의 호출 과 같습니다 .
일부 입력 유형 (즉,의 상수 InputType.TYPE_*
)은 setSingleLine(true)
암시 적으로 호출 하거나 최소한 동일한 효과를 얻습니다.
결론:
따라서 OP가 원하는 것을 달성하기 위해 암시 적 호출을 되돌림으로써 암시 적 설정에 대응합니다.
The accepted answer worked so well until I copied text with line-breaks into into the EditText. So I added onTextContextMenuItem to monitor the paste action.
@Override
public boolean onTextContextMenuItem(int id) {
boolean ret = super.onTextContextMenuItem(id);
switch (id) {
case android.R.id.paste:
onTextPaste();
break;
}
return ret;
}
public void onTextPaste() {
if (getText() == null)
return;
String text = getText().toString();
text = text.replaceAll(System.getProperty("line.separator"), " ");
text = text.replaceAll("\\s+", " ");
setText(text);
}
You can change the action button from code
editText.imeOptions = EditorInfo.IME_ACTION_DONE
editText.setRawInputType(InputType.TYPE_CLASS_TEXT)
Xml
android:inputType="textMultiLine"
Adding this property to the EditText
XML works for me:
android:lines="1"
It lets the users input newline characters but the EditText
itself does not increase in height.
<EditText
android:id="@+id/Msg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:lines="5"
android:selectAllOnFocus="true"
android:hint="Skriv meddelande...\n(max 100tkn)"/>
EditText et = (EditText)findViewById(R.id.Msg);
String strTmp = et.getText().toString();
strTmp = strTmp.replaceAll("\\n"," ");
EditText textView = new EditText(activity);
...
textView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
if(KeyEvent.KEYCODE_ENTER == keyEvent.getKeyCode()) {
return false;
}
.......
}
});
For a URI you could use:
android:inputType="textUri"
android:lines="1"
android:maxLength="128"
Otherwise android:inputType="textPersonName"
as mentioned above works for other EditText such user name, etc.
I will give another option so you don't have to subclass EditText. Create an InputFilter
that filters out linebreaks. Then use EditText.addInputFilter
.
Source code for such an input filter is here: https://gist.github.com/CapnSpellcheck/7c72830e43927380daf5205100c93977
You can pass 0 in the constructor, and it won't allow any newlines. Also, you can combine this with one of the other tweaks such as android:imeOptions="actionDone"
, as this will help improve the experience on some devices.
Here is the solution....
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="150"
android:textSize="15dp"
android:imeOptions="actionDone"
android:inputType="text|textMultiLine"/>
Usage in java class
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (keyCode==KeyEvent.KEYCODE_ENTER)
{
// Just ignore the [Enter] key
return true;
}
// Handle all other keys in the default way
return (keyCode == KeyEvent.KEYCODE_ENTER);
}
});
'Programing' 카테고리의 다른 글
MySQL 변경 테이블 추가 필드 이전 또는 이후 필드가 이미 존재 (0) | 2020.11.20 |
---|---|
문자열로 구성된 벡터 배열 초기화 (0) | 2020.11.20 |
Groovy 스크립트에 전달 된 인수를 캡처하는 방법은 무엇입니까? (0) | 2020.11.20 |
'System.Web.Helpers.Json..cctor ()'메서드가 'System.Web.Helpers.Json.CreateSerializer ()'메서드에 액세스하려는 시도가 실패했습니다. (0) | 2020.11.20 |
조각에서 권한을 확인하는 방법 (0) | 2020.11.19 |