완료 작업 버튼이있는 여러 줄 EditText


114

세트 가있는 EditText위젯 을 동시에 가질 수 있습니까?android:inputType="textMultiLine"android:imeOptions="actionDone"

키보드의 작업 버튼이 Enter (캐리지 리턴)가 아닌 완료로 된 여러 줄 편집 상자를 원하지만 작동하지 않는 것 같습니다 ..

미리 감사드립니다


여러 줄의 EditText와 Button이 함께 결합 된 복합 위젯을 사용해 보는 것은 어떻습니까?
Subin Sebastian 2011

답변:


194

사용하다

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

그리고 XML :

android:inputType="textMultiLine"

나를 위해 키보드가 내려 갔을 때 커서가 여전히 표시됩니다. textField.setCursorVisible(false);내부 에 추가해야 했습니다onEditorActionListener
Fonix

4.2.2 및 7.1.1에서 작동합니다. 감사.
tehcpu

1
아주 잘 작동합니다 ... 나는 그것을 찾기 위해 고군분투했습니다. 이 답변은 최고의 답변으로 표시되어야합니다
MFAL

7
XML로 모두 설정하는 것과 반대로 이것이 작동하는 이유는 무엇입니까?
Andrew Steinmetz

1
이 정보를 찾기 위해 고군분투했습니다. 여전히 매력적입니다!
Costin

51

Android 문서에서 : ' "textMultiLine"사용자가 줄 바꿈 (캐리지 리턴) 을 포함하는 긴 텍스트 문자열을 입력 할 수있는 일반 텍스트 키보드 . '따라서 키보드에서'완료 '버튼을 사용하려는 경우 textMultiLine 속성이 적합하지 않습니다.

done 버튼으로 여러 줄 (이 경우 3 줄) 입력 필드를 얻는 간단한 방법은 다음과 함께 EditText를 사용하는 것입니다.

android:lines="3" 
android:scrollHorizontally="false" 

그러나 어떤 이유로 이것은 레이아웃 파일 (onCreate에서) 대신 코드에서 이러한 설정을 수행하는 경우에만 작동합니다.

TextView tv = (TextView)findViewById(R.id.editText);
if (tv != null) {
    tv.setHorizontallyScrolling(false);
    tv.setLines(3);
}

알아내는 데 시간이 꽤 걸렸기 때문에 누군가에게 도움이되기를 바랍니다. 매니페스트에서 작동하도록하는 방법을 찾으면 알려주십시오.


4
나는 또한 시도 제안 maxLines()대신에 setLines()당신의 높이를 변경하는 것을 방지하려면EditText
다니엘 스미스

질문에서 android : imeOptions를 actionSend와 같은 값으로 설정해야한다는 것이 명확하지 않다고 생각합니다. 이 답변을 완료하고 setMaxLines가 코드로 덮어 쓰더라도 android : singleLine = "true"를 설정해야했습니다 (그렇지 않으면 "Send"와 같은 Enter 키가 제공되지 않습니다). <Enter> 동작을 캡처하려면 stackoverflow.com/questions/5014219/… 에서 첫 번째 답변을 확인하십시오 .
DNax

죄송합니다. <Enter> 캡처에 대해 찾은 최고의 대안은 @earlcasper 답변입니다. stackoverflow.com/questions/1489852/…
DNax

1
이것은 나를 위해 완벽하게 작동했습니다 (사용 setMaxLines(3)) 감사합니다!
laurencevs

1
매력처럼 작동했습니다. XML에도 android : imeOptions = "actionDone"android : inputType = "text"를 추가하고 XML에서 android : lines = "3"android : scrollHorizontally = "false"를 제거하면됩니다.
HannahCarney

24

작업 예! 이 기능을 지원하는 아래 사용자 정의 EditText 클래스를 만들고 xml 파일의 클래스를 사용합니다. 작동 코드 :

package com.example;

import android.content.Context;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;

public class ActionEditText extends EditText
{
   public ActionEditText(Context context)
   {
       super(context);
   }

   public ActionEditText(Context context, AttributeSet attrs)
   {
       super(context, attrs);
   }

   public ActionEditText(Context context, AttributeSet attrs, int defStyle)
   {
       super(context, attrs, defStyle);
   }

   @Override
   public InputConnection onCreateInputConnection(EditorInfo outAttrs)
   {
       InputConnection conn = super.onCreateInputConnection(outAttrs);
       outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
       return conn;
   }
}

<com.example.ActionEditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:imeOptions="actionDone"
       android:inputType="textAutoCorrect|textCapSentences|textMultiLine" />

이것은 나를 위해 일했습니다 내 요구 사항은 여러 줄이어야하고 소프트 키에 다음 버튼이 있어야하는 편집 텍스트를 만드는 것이 었습니다 ....... 그래서 내가 한 일에 감사드립니다. 편집 텍스트에 2 줄 추가 android : inputType = "textMultiLine"android : imeOptions = "actionNext"위의 사용자 정의 클래스에서 다음과 같이했습니다. InputConnection conn = super.onCreateInputConnection (outAttrs); //outAttrs.imeOptions & = ~ EditorInfo.IME_FLAG_NO_ENTER_ACTION; outAttrs.imeOptions & = EditorInfo.IME_ACTION_NEXT; 반환 conn;
yash

공장. Andorid 6.0.1에서 테스트되었습니다.
AmiguelS

9

Kotlin에서이 작업을 수행하려면 (선택적 textCapSentences으로이 확장 기능을 사용할 수있는 다른 구성을 적용 할 수도 있습니다.)

// To use this, do NOT set inputType on the EditText in the layout
fun EditText.setMultiLineCapSentencesAndDoneAction() {
    imeOptions = EditorInfo.IME_ACTION_DONE
    setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_TEXT_FLAG_MULTI_LINE)
}

용법:

myEditText.setMultiLineCapSentencesAndDoneAction()

1
2019 년 6 월 현재 작동합니다! 감사합니다 :)
로한 타네

나를위한 열쇠는 setRawInputType대신 사용하는 것이 었습니다setInputType
Tamoxin

9

나는 이것이 당신의 일을하는 방법이라고 생각합니다. 데 android:inputType="textMultiLine", android:imeOptions="actionDone"차종은 키 기능이 모호한 입력합니다. 을 (를) 사용 android:lines="10"하고 제거 할 수 있다는 점을 명심 하십시오 android:inputType="textMultiLine". 그러나 달성하려는 내용에 따라를 필요로하며 android:inputType="textMultiLine"대체 할 수 없습니다.

EditText ed=new EditText(this);
ed.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if(keyCode == KeyEvent.KEYCODE_ENTER){
                //do your stuff here
            }
            return false;
        }
});

android : lines = "10" 과 함께 고정 된 양의 최대 숫자를 사용 하면 키보드의 확인 버튼이 나타납니다. 예를 들어, 작은 maxLength 세트를 사용하여 얼마나 많은 줄이 있는지 알고 있다면 좋은 트릭입니다.
sunadorer

keyCode # 66을 비활성화하고 싶습니다. 가능합니까? 어떻게 할 수 있습니까?
Adil Malik 2013

1
왜 keyCode == 66 대신 keyCode == EditorInfo.IME_ACTION_GO입니까?
tse

5

이것은 나를 위해 완벽하게 작동하는 것 같습니다.

int lineNum = 2;
mEditText.setHorizontallyScrolling(false);
mEditText.setLines(3);

4

재사용 가능한 Kotlin 솔루션

코드에서 이러한 값 설정하는 것이 저에게 효과적이었습니다.

edittext.inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
edittext.setHorizontallyScrolling(false)
edittext.maxLines = Integer.MAX_VALUE // Or your preferred fixed value

나는 이것을 자주 요구하므로 코드를 깨끗하게 유지하기 위해 이것을 만들었습니다.

fun EditText.multilineIme(action: Int) {
    imeOptions = action
    inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
    setHorizontallyScrolling(false)
    maxLines = Integer.MAX_VALUE
}

// Then just call
edittext.multilineIme(EditorInfo.IME_ACTION_DONE)

'완료'에 선택적 사용자 지정 작업을 추가하려면 다음을 시도하십시오.

fun EditText.multilineDone(callback: (() -> Unit)? = null) {
    val action = EditorInfo.IME_ACTION_DONE
    multilineIme(action)
    setOnEditorActionListener { _, actionId, _ ->
            if (action == actionId) {
                callback?.invoke()
                true
            }
            false
        }
    }
}

// Then you can call
edittext.multilineDone { closeKeyboard() }

// or just
edittext.multilineDone()

콜백에서 키보드를 쉽게 제어해야합니까? 이 게시물 읽기

그런 다음 hideKeyboard()전화 추가EditText.multilineDone


1
☝️ 이것은 훌륭한 답변입니다
Michael

3

짧은 답변 : 아니요, API 레벨 11 (3.0) 이전에는 불가능하다고 생각합니다.

동일한 문제가 여기에서 발생했습니다 (수락 된 답변에 대한 의견에서 논의 됨).

Android 소프트 키보드 작업 버튼

마지막 댓글에서 :

내 휴대 전화의 몇 가지 앱을 보면 여러 줄 상자가 마지막에 표시되고 그 아래에 "완료"또는 "보내기"버튼이 표시되는 것이 일반적입니다 (예 : 이메일 앱).


3

이 상황을 해결하는 간단한 방법 :

  • 이 속성을 EditText에 유지하십시오.

    android:inputType="textMultiLine" 
    android:scrollHorizontally="false"
  • 그런 다음 ENTER를 누를 때만 키보드를 숨기려면 다음 코드를 추가하십시오.

    editText.setOnEditorActionListener(new OnEditorActionListener() 
    {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) 
        {
            editText.setSelection(0);
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);      
            return true;
         } 
         else 
         {
            return false;
         }
         }
    });

2

온 스크린 키보드 모양이 아니라면 키보드에 입력 리스너를 놓고 사용자가 줄 바꿈을 입력하면 "done"상태를 실행하면됩니다.


2

입력 옵션 textImeMultiline을 imeoptions flagnext 및 actionnext와 함께 사용하면 캐리지 리턴 대신 다음 버튼이 표시됩니다.


2

다른 솔루션 중 어느 것도 나를 위해 일한 적이 없었지만 다음 아름답게 작동했으며 물론 몇 가지 왜곡을 통해 더 많은 인터넷 검색을 할 수있게되었습니다. 불행히도 내가 코드를 어디서 얻었는지 기억하지 못하기 때문에 저자에게 그럴만 한 가치가있는 크레딧을 줄 수 없습니다.

Java 코드에서 :

////////////Code to Hide SoftKeyboard on Enter (DONE) Press///////////////
editText.setRawInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD|InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
editText.setImeActionLabel("DONE",EditorInfo.IME_ACTION_DONE);              //Set Return Carriage as "DONE"
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
    {
                if (event == null) {
                    if (actionId == EditorInfo.IME_ACTION_DONE) {
                        // Capture soft enters in a singleLine EditText that is the last EditText
                        // This one is useful for the new list case, when there are no existing ListItems
                        editText.clearFocus();
                        InputMethodManager inputMethodManager = (InputMethodManager)  getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
                        inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
                    }

                    else if (actionId == EditorInfo.IME_ACTION_NEXT) {
                        // Capture soft enters in other singleLine EditTexts
                    } else if (actionId == EditorInfo.IME_ACTION_GO) {
                    } else {
                        // Let the system handle all other null KeyEvents
                        return false;
                    }
                } 
        else if (actionId == EditorInfo.IME_NULL) {
                    // Capture most soft enters in multi-line EditTexts and all hard enters;
                    // They supply a zero actionId and a valid keyEvent rather than
                    // a non-zero actionId and a null event like the previous cases.
                    if (event.getAction() == KeyEvent.ACTION_DOWN) {
                        // We capture the event when the key is first pressed.
                    } else {
                        // We consume the event when the key is released.
                        return true;
                    }
                } 
        else {
                    // We let the system handle it when the listener is triggered by something that
                    // wasn't an enter.
                    return false;
                }
                return true;
        }
});




1

나는 4.x에 있고 setHorizontallyScrolling () (setLine () 또는 setMaxLines ()의 유무에 관계없이) 호출을 시도했으며 Done 버튼을 표시하기 위해 다양한 XML 구성을 시도했습니다. 그들 중 누구도 일하지 않았습니다. 요점은 EditText가 여러 줄인 경우 Android는이 문제를 해결하지 않는 한 항상 "Done"버튼 대신 캐리지 리턴을 표시하려고합니다.

캐리지 리턴의 동작을 다시 매핑하지 않는 가장 복잡한 솔루션은 https://stackoverflow.com/a/12570003/3268329 입니다. 이 솔루션은 여러 줄보기에 대해 IME_FLAG_NO_ENTER_ACTION 플래그를 강제로 설정하려는 Android의 끊임없는 욕구를 무효화하여 Done 버튼이 사라집니다.


0

나는 꽤 오랫동안 고생했지만 마침내 해결책을 찾았습니다!

다음과 같이 사용자 정의 EditText 클래스를 만드십시오.

public class EditTextImeMultiline extends EditText {

    public void init() {
        addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            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, "");
            }
        });
        setSingleLine();
        setHorizontallyScrolling(false);
        this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                EditTextImeMultiline.this.setLines(EditTextImeMultiline.this.getLineCount());
            }
        });
    }

    public EditTextImeMultiline(Context context) {
        super(context);
        init();
    }

    public EditTextImeMultiline(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }
}

이 클래스는 lineBreaks (\ n)를 제거하고 textMultiline처럼 텍스트를 래핑하며 Enter 버튼을 ImeAction;)으로 대체 할 수 있습니다.

클래식 EditText 클래스 대신 XML에서 호출하기 만하면됩니다.

여기에 논리를 설명하려면 :

  • Enter 대신 ImeAction 단추를 표시 할 수 있도록 EditText를 singleLine으로 설정하십시오.
  • 가로 스크롤을 제거하여보기 끝에 도달하면 텍스트가 다음 줄로 이동합니다.
  • onGlobalLayoutListener로 레이아웃 변경을 확인하고 "line"매개 변수를 editText가 보유한 현재 텍스트의 "lineCount"로 설정합니다. 이것이 높이를 새로 고치는 것입니다.

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