2.3에서 Done SoftInput 작업 레이블이있는 여러 줄 EditText
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" />
An alternative solution to subclassing the EditText class is to configure your EditText instance with this:
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
At least, this works for me on Android 4.0. It configures the EditText instance so that the user edits a single-line string that is displayed with soft-wrapping on multiple lines, even if an IME action is set.
Following previous answer
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;
}
}
Use this like
<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"/>
for put the action Done, you could use:
XML
android:inputType="text|textCapSentences"
JAVA
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
I hope its work for you.
Apparently the answer to the original question is Yes but I believe the Android team are trying to make developers think a little bit about how they use the multi-line EditText. They want the enter key to add newlines and probably expect that you provide a button or another input means to raise the event that you are done editing.
I have the same issue and my obvious solution was simply to add a done button and let the enter button add the newlines.
Use these attribute in your XML.
android:inputType="textImeMultiLine"
android:imeOptions="actionDone"
'program story' 카테고리의 다른 글
Windows의 Node.js-콘솔을 지우는 방법 (0) | 2020.10.06 |
---|---|
엔터프라이즈 iOS 애플리케이션을 설치할 때 "신뢰할 수없는 앱 개발자"메시지 (0) | 2020.10.06 |
열의 각 고유 값에 대해 첫 번째 행만 선택하는 방법 (0) | 2020.10.05 |
std :: string의 마지막 요소 가져 오기 (0) | 2020.10.05 |
여러 DOS 명령을 병렬로 실행하는 방법은 무엇입니까? (0) | 2020.10.05 |