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

时间:2013-07-29 19:31:29

标签: android searchview spannablestring

我发现将一系列SpannableString粘贴到SearchView中会保留字符串的跨度。当字符串粘贴到SearchView中时,删除所有格式的最佳方法是什么?

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

pasted spanned string into searchview

上面的文字在粘贴前都是灰色,斜体和上标。

1 个答案:

答案 0 :(得分:2)

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

  1. SearchView
  2. TextView版面获取search_plate
  3. 保留该引用(可能是公开的)
  4. 添加OnQueryTextListener
  5. 从字符串中删除任何范围
  6. 使用TextView引用重新设置没有跨度的文本。
  7. 请尝试并告诉我。

     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中添加条件。