我正在尝试过滤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;
}
}
答案 0 :(得分:6)
查看Android文档,他们声明KeyListener
:
请注意,对于大多数情况,此界面已被一般性取代 InputMethod定义的软输入方法;它应该只用于 对于应用程序有自己的屏幕键盘的情况 想要处理硬键盘事件以匹配它
对于方法getInputType()
:
如果返回TYPE_NULL,则不会提供软键盘。其他 单词,你必须提供自己的键盘用于屏幕输入和 键侦听器将用于处理来自硬键盘的输入。
如果返回任何其他值,将创建软输入法 当用户将焦点放在编辑器中时,它将提供键盘 并且还消耗硬键事件。 这意味着关键的监听器 通常不会使用,而是采用软输入法 根据此处返回的内容类型管理密钥输入。
因此,因为您返回内容类型,所以会忽略KeyListener。看起来这是不可能的,或者你找到了解决方法吗?
也许您可以创建自定义TextWatcher,然后使用EditText.addTextChangedListener(TextWatcher textWatcher)在EditText上设置它。?