单击span跨度字符串android

时间:2018-08-17 15:43:12

标签: java android android-layout layout spannablestring

嗨,我有一个包含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索引进行检查)

enter image description here

0 个答案:

没有答案