嗨,我有一个包含10个字符串的字符串列表,这些字符串是我使用StringBuilder附加的,并以段落的形式显示给用户。
现在我要做的是我必须制作一个“填空”类型的布局,其中每个句子应包含一个空格,用户可以单击并弹出单词列表,并且用户可以选择其中任何一个。
要实现这一目标,我首先从每个列表项中删除随机单词,然后将已删除的单词保存在列表“ words”中,并将其起始索引保存在列表“ indexes”中,如下所示:
words = new ArrayList<>();
indexes = new ArrayList<>();
for(int i=0; i<10; i++){
List<String> wordsList = Arrays.asList(sentences.get(i).split(" "));
String word = wordsList.get(new Random().nextInt(wordsList.size()));
int index = sentences.get(i).indexOf(word);
words.add(word);
indexes.add(index);
String replace = sentences.get(i).replaceAll("\\b" + word + "\\b", Utility.getSpaces(word));
sentences.set(i, replace);
spannableStrings.add(new SpannableString(sentences.get(i)));
}
这里替换字符串只是将每个项目中选择的单词替换为其长度的空白:
public static String getSpaces(String word){
String space = "";
for(int i=0; i<word.length(); i++){
space = space + ' ';
}
return space;
}
现在,在此之后,我将单击范围设置为删除了单词的部分:
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
// Here i have to know which one is clicked
Log.v("happy", widget.getId()+"its id");
}
};
for(int i=0; i<10; i++){
spannableStrings.get(i).setSpan(clickableSpan, indexes.get(i),
indexes.get(i) + words.get(i).length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
之后,我将使用SpannableStringBuilder追加这些列表项并将该文本设置为我的TextView:
SpannableStringBuilder builder = new SpannableStringBuilder();
for (int i=0; i<10; i++) {
builder.append(spannableStrings.get(i));
if (i == 5)
builder.append("\n");
}
TextView textView = (TextView) findViewById(R.id.content);
textView.setText(text);
textView.setMovementMethod(LinkMovementMethod.getInstance());
但是在我的布局中,仅显示了空格,这些空格从中删除了单词,但这些空格未加下划线,并且单击时什么也没有发生。
我还有一个问题,我将如何在onClick()方法中知道用户单击了哪个单词?
(忽略第一个单词,因为我只是使用默认的0到5索引进行检查)