答题框:EditText输入长度、输入内容的限制。

主要实现的功能是,根据题目的类型做出输入限制,如单选题,一共有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);
			}
		}
	}


因为小米系统在setKeyListener(DigitsKeyListener.getInstance());后默认输入法会出现只能输入数字的异常,所以经过更改,把setKeyListener(DigitsKeyListener.getInstance());功能实现在TextWatcher中,下面是改后的代码:

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;
	}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值