Android使用代碼實(shí)現(xiàn)一個(gè)填空題

學(xué)習(xí)一些基礎(chǔ)知識(shí)
public class SpannableStringActivity extends BaseActivity {@Bind(R.id.tv_content)TextView tvContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_spannable_string);ButterKnife.bind(this);initData();}private void initData() {String originContent = "你看我不僅能變顏色,還能點(diǎn)擊。";SpannableString content = new SpannableString(originContent);// 設(shè)置顏色ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#4DB6AC"));content.setSpan(colorSpan, 7, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 設(shè)置點(diǎn)擊事件MyClickableSpan myClickableSpan = new MyClickableSpan();content.setSpan(myClickableSpan, 12, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 設(shè)置此方法后,點(diǎn)擊事件才能生效tvContent.setMovementMethod(LinkMovementMethod.getInstance());tvContent.setText(content);}class MyClickableSpan extends ClickableSpan {@Overridepublic void onClick(View widget) {Toast.makeText(SpannableStringActivity.this, "我被點(diǎn)擊了", Toast.LENGTH_SHORT).show();}}}

Spanned.SPAN_INCLUSIVE_INCLUSIVE:前后都包括
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括
Spanned.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括
Spanned.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
實(shí)現(xiàn)
首先初始化一些數(shù)據(jù)
public class FillBlankView extends RelativeLayout {private TextView tvContent;private Context context;// 答案集合private List<String> answerList;// 答案范圍集合private List<AnswerRange> rangeList;// 填空題內(nèi)容private SpannableStringBuilder content;public FillBlankView(Context context) {this(context, null);}public FillBlankView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public FillBlankView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);this.context = context;initView();}private void initView() {LayoutInflater inflater = LayoutInflater.from(context);inflater.inflate(R.layout.layout_fill_blank, this);tvContent = (TextView) findViewById(R.id.tv_content);}...}
/*** 設(shè)置數(shù)據(jù)** @param originContent 源數(shù)據(jù)* @param answerRangeList 答案范圍集合*/public void setData(String originContent, List<AnswerRange> answerRangeList) {if (TextUtils.isEmpty(originContent) || answerRangeList == null|| answerRangeList.isEmpty()) {return;}// 獲取課文內(nèi)容content = new SpannableStringBuilder(originContent);// 答案范圍集合rangeList = answerRangeList;// 設(shè)置下劃線(xiàn)顏色for (AnswerRange range : rangeList) {ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#4DB6AC"));content.setSpan(colorSpan, range.start, range.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}// 答案集合answerList = new ArrayList<>();for (int i = 0; i < rangeList.size(); i++) {answerList.add("");}// 設(shè)置填空處點(diǎn)擊事件for (int i = 0; i < rangeList.size(); i++) {AnswerRange range = rangeList.get(i);BlankClickableSpan blankClickableSpan = new BlankClickableSpan(i);content.setSpan(blankClickableSpan, range.start, range.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}// 設(shè)置此方法后,點(diǎn)擊事件才能生效tvContent.setMovementMethod(LinkMovementMethod.getInstance());tvContent.setText(content);}
/*** 點(diǎn)擊事件*/class BlankClickableSpan extends ClickableSpan {private int position;public BlankClickableSpan(int position) {this.position = position;}@Overridepublic void onClick(final View widget) {View view = LayoutInflater.from(context).inflate(R.layout.layout_input, null);final EditText etInput = (EditText) view.findViewById(R.id.et_answer);Button btnFillBlank = (Button) view.findViewById(R.id.btn_fill_blank);// 顯示原有答案String oldAnswer = answerList.get(position);if (!TextUtils.isEmpty(oldAnswer)) {etInput.setText(oldAnswer);etInput.setSelection(oldAnswer.length());}final PopupWindow popupWindow = new PopupWindow(view, LayoutParams.MATCH_PARENT, dp2px(40));// 獲取焦點(diǎn)popupWindow.setFocusable(true);// 為了防止彈出菜單獲取焦點(diǎn)之后,點(diǎn)擊Activity的其他組件沒(méi)有響應(yīng)popupWindow.setBackgroundDrawable(new PaintDrawable());// 設(shè)置PopupWindow在軟鍵盤(pán)的上方popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);// 彈出PopupWindowpopupWindow.showAtLocation(tvContent, Gravity.BOTTOM, 0, 0);btnFillBlank.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 填寫(xiě)答案String answer = etInput.getText().toString();fillAnswer(answer, position);popupWindow.dismiss();}});// 顯示軟鍵盤(pán)InputMethodManager inputMethodManager =(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);}@Overridepublic void updateDrawState(TextPaint ds) {// 不顯示下劃線(xiàn)ds.setUnderlineText(false);}}
填寫(xiě)答案
/*** 填寫(xiě)答案** @param answer 當(dāng)前填空處答案* @param position 填空位置*/private void fillAnswer(String answer, int position) {answer = " " + answer + " ";// 替換答案AnswerRange range = rangeList.get(position);content.replace(range.start, range.end, answer);// 更新當(dāng)前的答案范圍AnswerRange currentRange = new AnswerRange(range.start, range.start + answer.length());rangeList.set(position, currentRange);// 答案設(shè)置下劃線(xiàn)content.setSpan(new UnderlineSpan(),currentRange.start, currentRange.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 將答案添加到集合中answerList.set(position, answer.replace(" ", ""));// 更新內(nèi)容tvContent.setText(content);for (int i = 0; i < rangeList.size(); i++) {if (i > position) {// 獲取下一個(gè)答案原來(lái)的范圍AnswerRange oldNextRange = rangeList.get(i);int oldNextAmount = oldNextRange.end - oldNextRange.start;// 計(jì)算新舊答案字?jǐn)?shù)的差值int difference = currentRange.end - range.end;// 更新下一個(gè)答案的范圍AnswerRange nextRange = new AnswerRange(oldNextRange.start + difference,oldNextRange.start + difference + oldNextAmount);rangeList.set(i, nextRange);}}}
public class MainActivity extends AppCompatActivity {@BindView(R.id.fbv_content)FillBlankView fbvContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);initData();}private void initData() {String content = "紛紛揚(yáng)揚(yáng)的________下了半尺多厚。天地間________的一片。我順著________工地走了四十多公里," +"只聽(tīng)見(jiàn)各種機(jī)器的吼聲,可是看不見(jiàn)人影,也看不見(jiàn)工點(diǎn)。一進(jìn)靈官峽,我就心里發(fā)慌。";// 答案范圍集合List<AnswerRange> rangeList = new ArrayList<>();rangeList.add(new AnswerRange(5, 13));rangeList.add(new AnswerRange(23, 31));rangeList.add(new AnswerRange(38, 46));fbvContent.setData(content, rangeList);}}
評(píng)論
圖片
表情
