将EditText imeOptions设置为actionNext在使用数字时无效

时间:2017-07-27 12:57:00

标签: android regex android-edittext

这是我的编辑文字: -

    <com.os.fastlap.util.customclass.EditTextPlayRegular
                    android:id="@+id/full_name_et"
                    style="@style/Edittext_white_13sp"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/_5sdp"
                    android:background="#00ffffff"
                    android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
                    android:imeOptions="actionNext"
                    android:inputType="text"
                    android:maxLength="20"
                    android:maxLines="1"
                    android:nextFocusDown="@+id/last_name_et"
                    android:textCursorDrawable="@null" /> 

当我在edittext中删除digit时,它工作正常,但digit imeOptions无法正常工作。但是,如果我使用singleLine而不是maxLines,它会发生一件令人惊讶的事情。但singleLine现已弃用。 我无法删除编辑文本中的数字,我也不想使用弃用的方法。任何人都可以解决这个问题。谢谢你

6 个答案:

答案 0 :(得分:3)

以下是软件键盘按钮“Next”的简化解决方案:

final String NOT_ALLOWED_CHARS = "[^a-zA-Z0-9]+";

final EditText editText = (EditText) findViewById(R.id.editText);
editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}

        @Override
        public void afterTextChanged(Editable s) {
            if (!TextUtils.isEmpty(s)) {
                // remove the listener to avoid StackoverflowException
                editText.removeTextChangedListener(this);
                // replace not allowed characters with empty strings
                editText.setText(s.toString().replaceAll(NOT_ALLOWED_CHARS, ""));
                // setting selection moves the cursor at the end of string
                editText.setSelection(editText.getText().length());
                // add the listener to keep watching
                editText.addTextChangedListener(this);
            }
        }
    });

此处,正则表达式[^a-zA-Z0-9]+对应于所讨论的android:digits的{​​{1}}的允许值。

答案 1 :(得分:2)

你可以使用

 android:lines="1"

取代

android:maxLines 

android:singleLine="true".

我知道你尝试了很多解决方案,试试

android:lines="1"
如果您之前没有尝试过这些话。

答案 2 :(得分:1)

问题是你点击Enter键而不是你需要的actionNext,以便将光标移动到下一个EditText

  

指定输入法操作

     

大多数软输入法在底部提供用户操作按钮   适合当前文本字段的角落。默认情况下   系统使用此按钮进行下一步或完成操作,除非你的   文本字段允许多行文本(例如with   android:inputType =&#34; textMultiLine&#34;),在这种情况下,操作按钮是   回车。但是,您可以指定其他操作   可能更适合您的文本字段,例如Send或Go。

它会导致操作按钮的回车。所以这意味着不会解雇android:nextFocusDown

首先,让我们看看不推荐使用的singleLine和maxLines

之间的区别

<强> SINGLELINE

当您设置android:singleLine="true"时,一行文字在EditText中可见,但Enter键在键盘中不可见

<强> MAXLINES

当您使用特定值设置android:maxLines属性时,在EditText中只能看到相同数量的行文本,并且在键盘中输入键也可用于输入。

因此,当您单击操作按钮时,它会根据您的代码触发Enter Action。如果您使用android:inputType="textMultiLine"属性

,则必须使用android:maxLines更改inputType属性
  

MAXLINES

     

在API级别1中添加了int maxLines使TextView最多为此   很多线条高。在可编辑文本上使用时,inputType   属性的值必须与text的MultiMine标志相结合   要应用的maxLines属性。

     

可以是整数值,例如&#34; 100&#34;。

当我使用正确的属性自定义代码时,它仍然触发了您想要的Enter键而不是IME_ACTION_NEXT。我认为由于

而没有解决问题
  

textMultiLine可以与文本及其变体结合使用   该字段中有多行文本。如果未设置此标志,则为文本   字段将被限制为单行。对应于   TYPE_TEXT_FLAG_MULTI_LINE。

  

TYPE_TEXT_FLAG_MULTI_LINE

     

在API级别3中添加了TYPE_TEXT_FLAG_MULTI_LINE标志   TYPE_CLASS_TEXT:可以在该字段中输入多行文本。   如果未设置此标志,则文本字段将被约束为a   单线。 IME可能 也选择不显示回车键   此标志未设置,因为不需要创建新行。

     

常数值:131072(0x00020000)

<强> SOLUTION:

子类EditText并调整IME选项。之后,您不需要android:maxLinesandroid:singleLine属性。

@Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        InputConnection connection = super.onCreateInputConnection(outAttrs);
        int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
        if ((imeActions&EditorInfo.IME_ACTION_NEXT) != 0) {
            // clear the existing action
            outAttrs.imeOptions ^= imeActions;
            // set the DONE action
            outAttrs.imeOptions |= EditorInfo.IME_ACTION_NEXT;
        }
        if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
            outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        }
        return connection;
    }

您还可以查看另一篇帖子here。我根据你的目的重新配置了这篇文章的接受答案

答案 3 :(得分:0)

android:digits指定EditText具有数字输入方法,符合docs

您可以使用android:inputType="personName"来实现与当前digits attr

相同的效果

答案 4 :(得分:0)

android:maxLines仅使TextView最多 这么多行 tall ,而不是阻止用户输入更多字符。

android:lines相同,只会使TextView 完全这么多行高。

答案 5 :(得分:0)

您的解决方案的变通方法代码如下,

XML文件

    <EditText
            android:id="@+id/full_name_et"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5sp"
            android:background="#00ffffff"
            android:imeOptions="actionNext"
            android:inputType="text"
            android:maxLines="1"
            android:maxLength="20"
            android:textCursorDrawable="@null" />

爪哇:

final EditText edtfirstName = (EditText) findViewById(R.id.full_name_et);


    edtfirstName.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
            if (charSequence.toString().startsWith(" ")) {
                String result = charSequence.toString().replace(" ", "").replaceAll("[^a-zA-Z]+", "");
                if (!charSequence.toString().equals(result)) {
                    edtfirstName.setText(result);
                    edtfirstName.setSelection(result.length());
                }
            } else {
                String result = charSequence.toString().replaceAll("[^a-zA-Z ]+", "");
                if (!charSequence.toString().equals(result)) {
                    edtfirstName.setText(result);
                    edtfirstName.setSelection(result.length());
                }
            }

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });