2.3에서 Done SoftInput 작업 레이블이있는 여러 줄 EditText


82

EditTextAndroid 2.3 에서 여러 줄을 표시 하고 IME 작업 레이블 "완료"를 사용 하는 방법이 있습니까?

Android 2.2에서는 이것이 문제가되지 않습니다. Enter 버튼은 IME 작업 레이블 "완료"( android:imeActionLabel="actionDone")를 표시하고 클릭하면 소프트 입력을 닫습니다.

EditText를 여러 줄로 구성 할 때 Android 2.3은 소프트 입력 키보드에 대한 "완료"작업을 표시하는 기능을 제거합니다.

를 사용하여 소프트 입력 입력 버튼의 동작을 변경 KeyListener했지만 입력 버튼은 여전히 ​​입력 키처럼 보입니다.


다음은 선언문입니다. EditText

<EditText
        android:id="@+id/Comment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="0dp"
        android:lines="3"
        android:maxLines="3"
        android:minLines="3"
        android:maxLength="60"
        android:scrollHorizontally="false"
        android:hint="hint"
        android:gravity="top|left"
        android:textColor="#888"
        android:textSize="14dp"
        />
<!-- android:inputType="text" will kill the multiline on 2.3! -->
<!-- android:imeOptions="actionDone" switches to a "t9" like soft input -->

inputType활동에서 콘텐츠보기 설정을로드 한 후 값을 확인하면 다음과 같이 표시됩니다.

inputType = 0x20001

그것은 :

  • 클래스 = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
  • 플래그 = InputType.TYPE_TEXT_FLAG_MULTI_LINE

답변:


163

글쎄요, TextView그리고 EditorInfo문서를 다시 읽은 후 , 플랫폼이 IME_FLAG_NO_ENTER_ACTION여러 줄 텍스트보기 를 강제 할 것이라는 것이 분명해졌습니다 .

참고 TextView자동으로 여러 줄의 텍스트보기에 당신을 위해이 플래그를 설정합니다.

내 솔루션은 EditText플랫폼이 구성하도록 한 후 IME 옵션 을 하위 클래스로 분류 하고 조정하는 것입니다.

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    InputConnection connection = super.onCreateInputConnection(outAttrs);
    int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
    if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
        // clear the existing action
        outAttrs.imeOptions ^= imeActions;
        // set the DONE action
        outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
    }
    if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
    }
    return connection;
}

위의 경우 IME_ACTION_DONE지루한 레이아웃 구성을 통해 달성 할 수 있음에도 불구하고 저도 강제 하고 있습니다.


24
나는 일반적으로 'omg thanks'와 같은 일반적인 말을하지 않지만이 답변은 충분히 도움이되었고 인정받을 가치가 있다고 생각했습니다. 요약하자면, 감사합니다. :-)
plowman 2011 년

3
대답은 +1이지만이 경우 코드에서 편집 텍스트의 입력 유형을 설정하는 경우. 세로 스크롤을 제거하고 가로 스크롤을 추가합니다. 이 문제를 해결하려면 아래 코드를 사용하십시오. editTextObj.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 여러 레이아웃에 동일한 뷰를 포함하여 뷰를 재사용하는 경우 일반적으로 발생할 수 있습니다. @ohhorob 솔루션에 대해 많은 감사드립니다.
Jayshil Dave

2
매력처럼 작동합니다! 그러나 나는 코드를 정말로 이해하지 못합니다. 깃발 메커니즘 전체를 읽을 수있는 곳이 있나요?
vanleeuwenbram

감사합니다, 저는 초보자입니다. 대화 상자를 사용하는 활동에 이것을 넣었 EditText으므로 활동 xml에 없습니다. 이 코드를 내 활동에 넣으려고했지만 오류가 발생 The method onCreateInputConnection(EditorInfo) of type SMSMain must override or implement a supertype method했습니다.. super처음에 전화 를했기 때문에 문제가 무엇인지 확실하지 않습니다. 제안 사항이 있습니까? 감사.
Azurespot

@NoniA. EditText의 하위 클래스를 만들어야합니다. 그 클래스에서이 메서드를 호출해야합니다. EditText로 확장되는 클래스를 만듭니다. 그 클래스에 그 메서드를 넣습니다.
Shah

103

Ohhorob의 대답은 기본적으로 정확하지만 그의 코드는 정말 중복됩니다! 기본적으로 훨씬 간단한 버전 (게으른 독자를위한 전체 코드)과 동일합니다.

package com.example.views;

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

// An EditText that lets you use actions ("Done", "Go", etc.) on multi-line edits.
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;
    }
}

이 기능이 작동하지 않도록하는 inputType것과 같은 일부 옵션에 유의하십시오 textShortMessage! 나는 당신이 inputType="text". 다음은 XML에서 사용할 수있는 방법입니다.

<com.example.views.ActionEditText
    android:id=...
    android:layout_stuff=...
    android:imeOptions="actionDone"
    android:inputType="textAutoCorrect|textCapSentences|textMultiLine"
    android:maxLines="3" />

Timmmm, 2.3에서 테스트 되었습니까?
ohhorob

1
코드가 2.3에서 작동한다면 내 코드도 마찬가지입니다. 그것들은 거의 동일하며, 나는 내 코드 나 당신의 코드를 기반으로했습니다. 4.0에없는 2.3의 특이점이 있습니까? 표준 "여러 줄 편집에 대한 작업 없음"은 Google에서 추가 한 의도적 인 동작입니다.
Timmmm

5
나는 이것을 2.3 (및 4.x)에서 시도했으며 내 응용 프로그램에서 작동했습니다.
mlc 2010 년

2
@ matej.smitala 네, 둘 다 가질 수는 없습니다.
Timmmm

1
최상의 솔루션을 몇 시간 동안 검색 한 후에는 Enter 키없이 여러 줄 편집 텍스트를 달성하는 가장 쉽고 간단한 방법 인 것 같습니다.
micnguyen 2014

56

EditText 클래스를 서브 클래 싱하는 대안은 다음과 같이 EditText 인스턴스를 구성하는 것입니다.

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

적어도 이것은 Android 4.0에서 나를 위해 작동합니다. IME 작업이 설정되어 있어도 사용자가 여러 줄에 소프트 랩핑으로 표시되는 한 줄 문자열을 편집하도록 EditText 인스턴스를 구성합니다.


2
@Futzilogik : 당신은 훨씬 더 많은 찬성표를받을 자격이 있습니다! 이 답변은 생명의 은인이자 간단한 답변이었습니다. 내 말은, 와우. 한 번 이상 찬성 할 수 있으면 좋겠습니다. 대단히 감사합니다!
Swayam 2014 년

3
나는 4.4.2를 실행 중이며 이것은 나를 위해 또는 적어도 내 방식으로 작동하지 않았습니다. XML로만 수행 했으므로 문제가 될 수 있습니다. inputType을 "textEmailAddress | textMultiLine"으로, scrollHorizontally를 false로, maxLines를 500 (xml 파일)으로, singleLine을 false로, imeOptions를 actionNext로 구성했습니다. inputtype에서 "textMultiLine"을 제거하려고했습니다. textMultiLine을 사용하면 키보드에서 ENTER 키를 얻습니다. 키가 없으면 모든 것이 한 줄에 유지되고 여전히 가로로 스크롤됩니다. 이것은 가장 쉬운 해결책처럼 보였지만 위의 방법이 저에게 효과적이므로 지금은 사용하십시오.
반응 코어

6
내 이전 댓글 (편집 할 수 없음)과 관련하여 MAX_VALUE를 설정하지 않거나 편집 텍스트가 생성 된 후이를 변경하는 문제라고 생각하고 여기에 표시된대로 코드를 시도했는데 작동합니다! 나는 다른 사람들을 위해 게시하고 싶었습니다. XML로 할 수 없습니다 (또는 어쨌든 할 수 없었습니다). 내가 가지고있는 다른 설정 : singleLine = false, imeOptions = actionNext, inputType = textEmailAddress (여러 줄 없음).
반응 코어

아주 잘 작동합니다. 이것은 오래된 답변을 개선하는 좋은 예입니다 !!
nPn 2014 년

Lollipop을 실행하는 Galaxy S5에서 나를 위해 일하고 있습니다. 훌륭한 솔루션. 이상한 XML 수평 스크롤을 설정하면 같은 효과가 발생하지 않는 것을
스콧 Birksted

7

이전 답변 다음

public class MultiLineText extends EditText {

    public MultiLineText(Context context) {
        super(context);
    }

    public MultiLineText(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

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

    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        InputConnection connection = super.onCreateInputConnection(outAttrs);
        int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
        if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
            // clear the existing action
            outAttrs.imeOptions ^= imeActions;
            // set the DONE action
            outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
        }
        if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
            outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        }
        return connection;
    }
}

이것을 사용하십시오

<myapp.commun.MultiLineText
  android:id="@+id/textNotes"
  android:layout_height="wrap_content"
  android:minHeight="100dp"
  android:layout_width="wrap_content"
  android:hint="Notes"
  android:textSize="20sp"
  android:padding="7dp"
  android:maxLines="4"/> 

5

작업 완료를 위해 다음을 사용할 수 있습니다.

XML

android:inputType="text|textCapSentences"    

자바

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

나는 그것이 당신을 위해 일하기를 바랍니다.


1

분명히 원래 질문에 대한 대답은 예이지만 Android 팀은 개발자가 여러 줄의 EditText를 사용하는 방법에 대해 조금 생각하도록 노력하고 있다고 생각합니다. 그들은 Enter 키가 줄 바꿈을 추가하기를 원하며 아마도 편집이 완료된 이벤트를 발생시키는 버튼 또는 다른 입력 수단을 제공 할 것으로 예상합니다.

나는 같은 문제가 있고 분명한 해결책은 단순히 완료 버튼을 추가하고 Enter 버튼이 줄 바꿈을 추가하도록하는 것입니다.


죄송합니다. 제 질문이 명확하지 않을 수 있습니다. 여러 줄은 한 줄 입력을 소프트 래핑하는 것입니다. 즉 개행 문자는 허용되지 않습니다.
ohhorob

@Mullins : SoftInput 키보드에 "완료"버튼을 추가 했습니까? "엔터"를 유지하면서 어떻게 했습니까?
alex.veprik 2012

아니. 키보드와 별도로 UI에 완료 버튼을 만들었습니다.
Mullins 2012

1
Android 팀은 자신의 조언에 따라 메시징 앱의 여러 줄 텍스트 편집기의 작업 버튼이 메시지를 보내는 대신 줄 바꿈을 만들도록해야 할 것입니다.
Timmmm

0

XML에서이 속성을 사용하십시오.

android : inputType = "textImeMultiLine"

android : imeOptions = "actionDone"

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