ohh*_*rob 80 android android-edittext
有没有办法让Multi-Line EditText出现并在Android 2.3上使用IME Action Label"Done"?
在Android 2.2中,这不是问题,输入按钮显示IME操作标签"完成"(android:imeActionLabel="actionDone"),并在单击时取消软输入.
配置EditText多线时,Android 2.3无法显示软输入键盘的"完成"操作.
我已经设法通过使用a来改变Soft Input输入按钮的行为KeyListener,但是enter按钮仍然看起来像一个回车键.
这是宣言 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 -->
Run Code Online (Sandbox Code Playgroud)
inputType在加载后在活动中设置内容视图时检查值,它显示为:
inputType = 0x20001
Run Code Online (Sandbox Code Playgroud)
这是:
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMALInputType.TYPE_TEXT_FLAG_MULTI_LINEohh*_*rob 161
好吧,在重新阅读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;
}
Run Code Online (Sandbox Code Playgroud)
在上面,我也强迫IME_ACTION_DONE,即使这可以通过繁琐的布局配置来实现.
Tim*_*mmm 101
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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,一些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" />
Run Code Online (Sandbox Code Playgroud)
小智 55
子类化EditText类的另一种解决方案是使用以下方法配置EditText实例:
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)
至少,这适用于Android 4.0.它配置EditText实例,以便用户编辑单线字符串,即使设置了IME操作,也会在多行上进行软包装.
小智 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;
}
}
Run Code Online (Sandbox Code Playgroud)
使用它就像
<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"/>
Run Code Online (Sandbox Code Playgroud)
要完成操作,可以使用:
XML格式
android:inputType="text|textCapSentences"
Run Code Online (Sandbox Code Playgroud)
爪哇
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)
希望它对您有用。
| 归档时间: |
|
| 查看次数: |
37271 次 |
| 最近记录: |