Android:EditText的KeyListener无法正常工作(Android : KeyListener of EditText not working)

编程入门 行业动态 更新时间:2024-10-25 14:29:24
Android:EditText的KeyListener无法正常工作(Android : KeyListener of EditText not working)

我正在尝试过滤EditText的输入字符以仅允许有效的浮点值。 (例如:“12,45”,只有一个逗号,......)。

为此,我使用KeyListener (不要与onKeyListener或textChangeListener混淆。我想阻止用户输入无效数据)。

在Android 2.3.6和3.2上,没有调用keyListener.filter()和keyListener.getAcceptedChars(),我可以引入任何char(不限于.getAcceptedChars())

我找到了关于keyListener的小文档。 如果你有一个很好的例子或文档,我很感兴趣。

任何线索为什么这不起作用?

我做错了什么 ?

活动代码示例:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(...); setContentView(R.layout.editTextTest_lyt); ... mEditTextTest = (EditText) findViewById(R.id.editTextTest); mEditTextTest.setKeyListener(new NumberCommaDecimalKeyListenerTest()); ...}

布局代码示例:

editTextTest_lyt.xml: <EditText android:id="@+id/editTextTest" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1" android:inputType="numberSigned|numberDecimal" android:ems="5" android:maxLength="9" android:maxLines="1" android:gravity="right|center_vertical" android:imeOptions="actionNext"/>

KeyListener代码示例:

public class NumberCommaDecimalKeyListenerTest extends NumberKeyListener { private static final char[] mAccepted = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', ',' }; private static final boolean mSign = true; private static final boolean mDecimal = true; @Override protected char[] getAcceptedChars() { Log.e("LODA", "KeylistenerTest.getAcceptedChars()"); // DONT show up in logs return mAccepted; } public NumberCommaDecimalKeyListenerTest() { super(); Log.e("LODA", "CREATE KeylistenerTest"); // show up in logs } @Override public int getInputType() { Log.e("LODA", "KeylistenerTest.getInputType()"); // show up in logs int contentType = InputType.TYPE_CLASS_NUMBER; if (mSign) { contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED; } if (mDecimal) { contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL; } return contentType; } @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Log.e("LODA", "enter KeylistenerTest.filter"); // DONT show up in logs // My logic will go here... // if user pressed '.', is changed for ',' source = source.toString().replace(".", ","); source = source.toString().replace("6", "9"); CharSequence out = super.filter(source, start, end, dest, dstart, dend); return out; } }

I'm trying to filter the input char of an EditText to allow only valid float value. (e.g. :"12,45", only one comma, ...).

For this, I use the KeyListener (dont confuse with onKeyListener or textChangeListener. I want to prevent the user from entering invalid data).

On Android 2.3.6 and 3.2 the keyListener.filter() and keyListener.getAcceptedChars() are not called and I can introduce any char (not limited to .getAcceptedChars())

I found little documentations about keyListener. If you got a good example or doc, I'm very interested.

Any clue why this is not working ?

What did I do wrong ?

Activity Code sample:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(...); setContentView(R.layout.editTextTest_lyt); ... mEditTextTest = (EditText) findViewById(R.id.editTextTest); mEditTextTest.setKeyListener(new NumberCommaDecimalKeyListenerTest()); ...}

Layout Code sample:

editTextTest_lyt.xml: <EditText android:id="@+id/editTextTest" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1" android:inputType="numberSigned|numberDecimal" android:ems="5" android:maxLength="9" android:maxLines="1" android:gravity="right|center_vertical" android:imeOptions="actionNext"/>

KeyListener Code sample:

public class NumberCommaDecimalKeyListenerTest extends NumberKeyListener { private static final char[] mAccepted = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', ',' }; private static final boolean mSign = true; private static final boolean mDecimal = true; @Override protected char[] getAcceptedChars() { Log.e("LODA", "KeylistenerTest.getAcceptedChars()"); // DONT show up in logs return mAccepted; } public NumberCommaDecimalKeyListenerTest() { super(); Log.e("LODA", "CREATE KeylistenerTest"); // show up in logs } @Override public int getInputType() { Log.e("LODA", "KeylistenerTest.getInputType()"); // show up in logs int contentType = InputType.TYPE_CLASS_NUMBER; if (mSign) { contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED; } if (mDecimal) { contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL; } return contentType; } @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Log.e("LODA", "enter KeylistenerTest.filter"); // DONT show up in logs // My logic will go here... // if user pressed '.', is changed for ',' source = source.toString().replace(".", ","); source = source.toString().replace("6", "9"); CharSequence out = super.filter(source, start, end, dest, dstart, dend); return out; } }

更多推荐

本文发布于:2023-07-24 10:55:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1245030.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:无法正常   工作   EditText   Android   working

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!