Android EditText:完成而不是Enter或Word Wrap而不是Multi Line

Bry*_*eld 15 android action multiline word-wrap android-edittext

我有一个不允许换行的多行EditText.现在我一点击保存就用一些空格替换返回.有什么办法可以用完成按钮替换屏幕输入按钮吗?(就像单行EditText一样)

我知道我仍然应该删除return(\r\n|\r|\n)因为屏幕键盘不是添加它们的唯一方法.

这是我目前的XML

<EditText android:layout_width="fill_parent" android:layout_height="wrap_content"
          android:minLines="3" android:gravity="left|top"
          android:inputType="textMultiLine|textAutoCorrect|textCapSentences"
          android:imeOptions="actionDone" />
Run Code Online (Sandbox Code Playgroud)

小智 26

我建议阅读这篇文章

http://savagelook.com/blog/android/android-quick-tip-edittext-with-done-button-that-c​​loses-the-keyboard

非常好的例子

XML:

<EditText 
    android:id="@+id/edittext_done"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Enter some text"
    android:imeOptions="actionDone"
    />
Run Code Online (Sandbox Code Playgroud)

自定义动作类:

class DoneOnEditorActionListener implements OnEditorActionListener {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
            return true;  
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

活动类:

public class SampleActivity extends Activity {    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_activity_layout); // sample_activity_layout contains our target EditText, target_edittext

        EditText targetEditText = (EditText)findViewById(R.id.target_edittext); 
        targetEditText.setOnEditorActionListener(new DoneOnEditorActionListener());

        // The rest of the onCreate() code
   }
}
Run Code Online (Sandbox Code Playgroud)


小智 20

android:inputType="textEmailAddress|textEmailSubject"
Run Code Online (Sandbox Code Playgroud)

您需要将输入类型设置为电子邮件地址或电子邮件主题.任何一个都会给你你想要的结果.shouldAdvanceFocusOnEnter()是TextView中的私有方法,用于确定是输入新行还是将焦点移动到下一个字段.

  • 这实际上适用于多行文字吗?如果我不在textMultiLine中管道,我只能得到完成按钮. (3认同)

Mr-*_*IDE 5

如果您android:inputType="textMultiLine|..."在XML中使用,或使用相应的Java代码:

editField.setInputType(
    InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
Run Code Online (Sandbox Code Playgroud)

那么显示一个✔︎ Done Search按钮的唯一解决方案是遵循这里的答案:

多线EditText,2.3上有完成的SoftInput动作标签

所以你应该扩展EditText和覆盖onCreateInputConnection()以手动设置IME_ACTION_xx标志; 像这样的东西......

@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)

这是因为无论何时启用该"textMultiLine"选项,它都会忽略android:imeOptions="actionDone"or的任何设置android:imeActionLabel="actionDone",这是非常奇怪和令人困惑的.