android - 如何从粘贴到 SearchView 的文本中删除格式?

标签 android searchview spannablestring

我发现将 SpannableString 的选择粘贴到 SearchView 中可以保留字符串的跨度。将字符串粘贴到 SearchView 时去除所有格式的最佳方法是什么?

这是一个正在发生的事情的例子:

pasted spanned string into searchview

上面的文本在粘贴之前是灰色的、斜体的和上标的。

最佳答案

我不确定是否有办法检测文本是否直接粘贴或手动输入到 SearchView 查询监听器中,但您可以像这样绕过它:

  1. SearchViewsearch_plate 布局中获取 TextView
  2. 保留该引用(可能是公开的)
  3. 添加OnQueryTextListener
  4. 从字符串中删除任何跨度
  5. 使用 TextView 引用重新设置没有跨度的文本。

请尝试并告诉我。

 int searchTextViewId = mSearchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
            mSearchTextView = (TextView) mSearchView.findViewById(searchTextViewId);
        mSearchView.setOnQueryTextListener(new OnQueryTextListener(){

            @Override
            public boolean onQueryTextChange(String arg0) {
                if(!TextUtils.isEmpty(arg0)){
                    arg0 = removeSpan(new SpannableString(arg0));
                    mSearchView.setOnQueryTextListener(null);
                    mSearchTextView.setText(arg0);
                    mSearchView.setOnQueryTextListener(this);
                }
                return false;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                // TODO Auto-generated method stub
                return false;
            }});
        }


    private String removeSpan(Spannable s){
          s.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL),    0, s.length(),    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
          return s.toString();
    }

这里还有如何从剪贴板获取最后复制的文本:

private boolean isTextPasted(Context context, String text){
        ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); 
        if(!clipboard.hasPrimaryClip()) 
            return false;

        ClipData clipData = clipboard.getPrimaryClip();
        String lastClipText = clipData.getItemAt(clipData.getItemCount()-1).coerceToText(context).toString();
        return !TextUtils.isEmpty(lastClipText) && lastClipText.equals(text);
    }

您可以将其添加到 OnQueryTextListener 中的条件。

关于android - 如何从粘贴到 SearchView 的文本中删除格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17932616/

相关文章:

android - 如何在路径上渲染文本?

android - 在 Android Studio 中创建基于 Phonegap 的 Android 应用

android - fragment 的单独搜索 View

android - 尝试将搜索 View 实现为自动完成 TextView 时出现空指针异常

android - fragment 间调用方法

java - 如何重用另一个步骤定义类 Appium/Cucumber/Java 中的方法

android - 如何在 searchView 和下拉列表之间添加空间(例如 height = 20dp)?

java - Spannables 不为 TextView 中的文本着色

android - 如何在android中的同一个textview中有粗体和普通文本?

android - SpannableString 第一次改变颜色,但在重复使用时不改变颜色