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