Android:突出显示搜索结果,如Apple';s notes.app

Android:突出显示搜索结果,如Apple';s notes.app,android,Android,我是Android新手。我用的是iPhone,所以我不仅不熟悉编程,而且完全熟悉操作系统。我这周刚开始写一个基本的notes应用程序 现在,当我转到“搜索”视图时,搜索说“猫”,如果出现一个结果,我单击转到该注释,我希望突出显示“猫”的所有实例。然后,当我点击编辑文本时,我希望高亮显示消失 如果我能在搜索视图中突出显示文本,那也太棒了 苹果的Notes.app做到了这一点,我认为它确实增加了搜索功能。找不到任何图像来告诉你我的意思。希望我解释得足够好 我试过这个: //highlight

我是Android新手。我用的是iPhone,所以我不仅不熟悉编程,而且完全熟悉操作系统。我这周刚开始写一个基本的notes应用程序

现在,当我转到“搜索”视图时,搜索说“猫”,如果出现一个结果,我单击转到该注释,我希望突出显示“猫”的所有实例。然后,当我点击编辑文本时,我希望高亮显示消失

如果我能在搜索视图中突出显示文本,那也太棒了

苹果的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);
但是如果同一个词有多个,我们就会遇到问题。有什么想法吗?

选择和突出显示不是一回事。通常,选择某物也会高亮显示它,但您不会通过选择它来高亮显示某物。此外,Android不支持在
EditText
中进行多选

要突出显示,需要将
字符样式
应用于文本范围,例如
背景色span

应用
背景色span
突出显示
文本视图中的搜索结果,使用:

  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
,因此相同的基本概念将适用于此处。然而,IMHO在
EditText
中进行这种突出显示对用户来说是陌生的。我会在一个普通的
TextView
中显示搜索结果,带有一个“编辑”操作栏项或一些可以进入编辑模式的东西。

我用谷歌搜索了一下,发现搜索“java”而不是“安卓”很有帮助。以下是我的工作代码:

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);
         }
    }
private void highlightindex(字符串查询){
String text=editText.getText().toString();
Map indexMap=getindex(查询);
Spannable Spannable=新的SpannableString(文本);
迭代器keySetIterator=indexMap.keySet().Iterator();
while(keySetIterator.hasNext()){
整数key=keysiterator.next();
整数值=indexMap.get(键);
spannable.setSpan(新的ForegroundColorSpan(Color.BLUE),键,值,0);
}
editText.setText(spannable);
}
私有映射getIndexes(字符串查询){
Map indexMap=newtreemap();
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(查询);
y=i+queryLength-1;
指数映射put(i,y);
而(i>=0){
i=text.indexOf(查询,i+1);
y=i+queryLength-1;
如果(i!=-1&&y!=-1){
指数映射put(i,y);
}
}

我以类似的方式解决了我自己的问题。我将在下面发布代码。我喜欢你关于首先进入纯文本视图的评论。我一直很恼火每次单击都要编辑时阅读注释有多么困难。EditText上是否有可编辑的标志,或者我只需要在页面中添加另一个元素?@Brandon:“EditText上有可编辑的标志吗”--不是真的。@Brandon:是的,但我的理解是,它在各种设备上运行得不太好,尽管我已经有一段时间没有听到任何关于它的抱怨了。它也被弃用了。Eclipse刚刚告诉我使用android:inputType=“无”取而代之的是,我将尝试一下。在代码中切换它似乎更容易,而不是在editView上创建一个textView并尝试在代码中切换它们。