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