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

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



답변

글쎄요, 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지루한 레이아웃 구성을 통해 달성 할 수 있음에도 불구하고 저도 강제 하고 있습니다.


답변

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" />


답변

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

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

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


답변

이전 답변 다음

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"/>


답변

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

XML

android:inputType="text|textCapSentences"

자바

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

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


답변

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

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


답변

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

android : inputType = “textImeMultiLine”

android : imeOptions = “actionDone”