我正在尝试过滤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; } }更多推荐
发布评论