Android:在Apple的notes.app等结果中突出显示搜索查询

时间:2014-08-08 13:48:32

标签: android

我是Android新手。我使用iPhone,所以我不仅仅是编程的新手,而且还完全是操作系统。我刚开始这个星期,并写了一个基本的笔记应用程序。

现在,当我进入搜索视图时,搜索说“猫”,如果出现结果并且我点击进入该注释,我希望突出显示所有“猫”实例。然后,当我点击EditText时,我希望突出显示消失。

如果我可以在搜索视图中突出显示文本,那也很棒。

Apple的Notes.app执行此操作,我认为它确实增加了搜索功能。找不到任何图片来告诉你我的意思。希望我解释得很好。

我试过了:

    //highlight searched text

    //Get the text of the EditText
    String text = editText.getText().toString();

    //Get indexes of the query in the EditText
    int firstIndex = text.indexOf(query);
    int lastIndex = text.lastIndexOf(query);

    //Highlight the selection
    editText.setSelection(firstIndex, lastIndex);

但是如果有多个相同的单词,我们会遇到问题。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

选择突出显示不是一回事。通常,选择某些内容也会突出显示它,但您不会通过选择它来突出显示某些内容。此外,Android不支持EditText中的多项选择。

要突出显示,您需要将CharacterStyle应用于文字范围,例如BackgroundColorSpan

This sample project应用BackgroundColorSpan突出显示TextView中的搜索结果,使用:

  private void searchFor(String text) {
    TextView prose=(TextView)findViewById(R.id.prose);
    Spannable raw=new SpannableString(prose.getText());
    BackgroundColorSpan[] spans=raw.getSpans(0,
                                             raw.length(),
                                             BackgroundColorSpan.class);

    for (BackgroundColorSpan span : spans) {
      raw.removeSpan(span);
    }

    int index=TextUtils.indexOf(raw, text);

    while (index >= 0) {
      raw.setSpan(new BackgroundColorSpan(0xFF8B008B), index, index
          + text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
      index=TextUtils.indexOf(raw, text, index + text.length());
    }

    prose.setText(raw);
  }

首先显示的代码会删除所有现有BackgroundColorSpan个实例,然后根据搜索字符串应用新实例。

由于EditText继承自TextView,因此这里适用相同的基本概念。但是,恕我直言,在EditText中进行此类突出显示对用户来说是陌生的。我会在普通TextView中显示搜索结果,并使用“编辑”操作栏项或其他内容进入编辑模式。

答案 1 :(得分:0)

我做了一些谷歌搜索,看起来搜索“java”而不是“android”是有帮助的。以下是我的工作代码:

private void highlightIndexes(String query){
    String text = editText.getText().toString();
    Map<Integer, Integer> indexMap = getIndexes(query);
    Spannable spannable=new SpannableString(text);

    Iterator<Integer> keySetIterator = indexMap.keySet().iterator();

    while(keySetIterator.hasNext()){
        Integer key = keySetIterator.next();
        Integer value = indexMap.get(key);
        spannable.setSpan(new ForegroundColorSpan(Color.BLUE), key, value, 0);
    }

    editText.setText(spannable);

}

private Map<Integer, Integer> getIndexes(String query){
    Map<Integer, Integer> indexMap = new TreeMap<Integer, Integer>();
    int queryLength = query.length();
    query = query.substring(0, (queryLength -1)).toLowerCase(Locale.US);
    String text = editText.getText().toString().toLowerCase(Locale.US);
    int i, y;

    i = text.indexOf(query);
    y = i + queryLength - 1;
    indexMap.put(i, y);

    while(i >= 0) {
         i = text.indexOf(query, i+1);
         y = i + queryLength - 1;

         if (i != -1 && y != -1){
             indexMap.put(i, y);
         }
    }