主要实现的功能是,根据题目的类型做出输入限制,如单选题,一共有A、B两个选择,那么答案长度为1,输入的有效字符只能是A或者B。如果是多选题,选项有A、B、C、D四个选项,那么答案长度是4,只能输入ABCD中任意几个,而且无法输入重复的答案,即(输入“AADC” 将会被认为是“ADC”)。
之前使用的是EditText的 setKeyListener(DigitsKeyListener.getInstance());来做对输入内容的限制。使用addTextChangedListener()来对输入的长度做限制,经过测试发现,小米手机在设置 setKeyListener(DigitsKeyListener.getInstance());后默认的输入法只能输入数字,而限制的内容确是英文字符。下面是之前的代码
answerEdit.setKeyListener(DigitsKeyListener.getInstance(getDigits(item.getItemNums())));
<pre code_snippet_id="461934" snippet_file_name="blog_20140901_4_8780323" name="code" class="java">answerEdit.addTextChangedListener(new MyTextWatcher(item
.getType(), item.getItemNums(), answerEdit));
MyTextWatcher构造参数第一个参数题目类型(1、3为单选和判断,2为多选),第二个参数是题目的选项个数,第三个是该edittext。
MyTextWatcher.class
public String getDigits(int num) //根据题目选项个数获取有效的字符(含大小写)
{
char []digits = {'a', 'A', 'b' ,'B', 'c', 'C', 'd', 'D', 'e', 'E',
'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J'};
return new String(digits).substring(0, num * 2);
}
class MyTextWatcher implements TextWatcher
{
private EditText mView;
private CharSequence temp;
private int selectionStart;
private int selectionEnd;
private int count;
public MyTextWatcher(int type, int itemNum, EditText mView)
{
this.mView = mView;
switch (type)
{
case 1: count = 1; break;
case 2: count = itemNum; break;
case 3: count = 1; break;
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after)
{
temp = s;
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count)
{
}
@Override
public void afterTextChanged(Editable s)
{
selectionStart = mView.getSelectionStart();
selectionEnd = mView.getSelectionEnd();
if (temp.length() > count)
{
s.delete(selectionStart - 1, selectionEnd);
int tempSelection = selectionStart;
mView.setText(s);
mView.setSelection(tempSelection);
}
}
}
answerEdit.addTextChangedListener(new MyTextWatcher(item
.getType(), item.getItemNums(), answerEdit));
MyTextWatcher.class
public String getDigits(int num)//根据题目选项个数获取有效的字符(含大小写)
{
char[] digits = {'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f',
'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J'};
return new String(digits).substring(0, num * 2);
}
class MyTextWatcher implements TextWatcher
{
private EditText mView;
private String text = "";
private int type;
private int itemNum;
public MyTextWatcher(int type, int itemNum, EditText mView)
{
this.mView = mView;
this.type = type;
this.itemNum = itemNum;
}
@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)
{
switch (type)
{
case 1:
case 3:
{
if (StringUtils.isEmpty(s.toString()))
{
text = "";
}
else
{
text = getText(s.toString(), itemNum);
}
if (!text.equals(mView.getText().toString()))
{
mView.setText(text);
}
break;
}
case 2:
{
if (StringUtils.isEmpty(s.toString()))
{
text = "";
}
else
{
text = getTexts(s.toString(), itemNum);
}
if (!text.equals(mView.getText().toString()))
{
mView.setText(text);
}
break;
}
}
}
}
private String getText(String s, int num)//获取单选、判断题的有效字符
{
String digist = getDigits(num);
char[] arr = s.toCharArray();
for (char ch : arr)
{
if (digist.contains(String.valueOf(ch)))
{
return String.valueOf(ch);
}
}
return "";
}
private String getTexts(String s, int num)//获取多选题的有效字符
{
String digist = getDigits(num);
String text = "";
char[] arr = s.toCharArray();
int aNum = 0;
for (int i = 0; i < arr.length; i ++)
{
char ch = arr[i];
if (digist.contains(String.valueOf(ch)) && !text.contains(String.valueOf(ch)))
{
if (aNum == num)
{
return text;
}
text += String.valueOf(ch);
aNum ++;
}
}
return text;
}