有没有办法让多行EditText
出现并在Android 2.3上使用IME行动标签“完成”?
在Android 2.2中,这不是问题,输入按钮显示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
答案 0 :(得分:160)
好了,在重新阅读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
,即使这可以通过繁琐的布局配置来实现。
答案 1 :(得分:100)
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" />
答案 2 :(得分:55)
继承EditText类的另一种解决方案是使用以下方法配置EditText实例:
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
至少,这适用于Android 4.0。它配置EditText实例,以便用户编辑单行字符串,即使设置了IME操作,也会在多行上进行软包装显示。
答案 3 :(得分:6)
按照上一个回答
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"/>
答案 4 :(得分:4)
将动作完成后,您可以使用:
XML
android:inputType="text|textCapSentences"
JAVA
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
我希望它适合你。
答案 5 :(得分:1)
显然原始问题的答案是肯定的,但我相信Android团队正在努力让开发人员思考他们如何使用多行EditText。他们希望输入键添加换行符,并且可能希望您提供一个按钮或其他输入方法来引发您已完成编辑的事件。
我有同样的问题,我的明显解决方案只是添加一个完成按钮,然后让回车按钮添加换行符。
答案 6 :(得分:0)
在XML中使用这些属性。
机器人:的inputType = “textImeMultiLine”
机器人:imeOptions = “actionDone”