EditText
Android 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”