Programing

EditText에서 Enter 키를 방지하지만 텍스트는 여러 줄로 표시됩니다.

lottogame 2020. 11. 20. 08:23
반응형

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

참고URL : https://stackoverflow.com/questions/6070805/prevent-enter-key-on-edittext-but-still-show-the-text-as-multi-line

반응형