如何在Spannable TextView之间设置边距?

4
我正在尝试创建可跨度文本视图并在EditText中显示它。因此,用户可以在EditText中输入一些内容,如果用户按下键盘的enter按钮,则将此文本转换为可跨度文本视图,之后用户可以再次开始输入并按下键盘的enter按钮,然后第二个可跨度文本视图将创建并显示在edittext中,但是。 我卡住了哪里? 当我创建两个可跨度文本视图时,这两个文本视图会略微重叠在彼此上方。我想在这两个可跨度文本视图之间设置边距。
我还尝试使用LayoutParam设置文本视图之间的边距,但没有成功。
这是一个图片,显示了文本视图在EditText中重叠的情况。

enter image description here

y藏在美味的下方

这是我的代码。

txtDishTags.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId,
                KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH
                    || actionId == EditorInfo.IME_ACTION_NEXT
                    || actionId == EditorInfo.IME_ACTION_DONE
                    || actionId == EditorInfo.IME_ACTION_GO) {
                txtDishTags.dismissDropDown();
                  if(txtDishTags.getText().toString().trim().length()>=1){
                isEntered = true;

                String[] separated = tags.split(",");
                tags = separated[separated.length-1];
                if(tags.trim().length()>=1){
                TextView tv = createContactTextView(tags);
                BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
                bd.setBounds(-20, 0, bd.getIntrinsicWidth(),
                        bd.getIntrinsicHeight());
                sb.append(tags + ",");
                sb1 = new SpannableStringBuilder();
                sb1.append(tags + ",");
                sb.setSpan(new ImageSpan(bd),
                        sb.length() - tags.length(), sb.length(),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                sb.setSpan(clickSpan, sb.length() - tags.length(),
                        sb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                txtDishTags.setText("");
                txtDishTags.setText(sb);    
                int length = sb.length();
                txtDishTags.setSelection(length, length);
                }
                }
            }
            return false;
        }
    });  

public TextView createContactTextView(String text) {
    //llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 44);
        //llp.setMargins(5, 0, 20, 0);
    TextView tv = new TextView(this);
    tv.setText(text);
    tv.setTextSize(30);     
    Typeface faceBook = Typeface.createFromAsset(getAssets(),
            "fonts/eau_sans_book.otf");
    tv.setTypeface(faceBook);   
    tv.setTextColor(getResources().getColor(R.color.backgroundcolor));
    tv.setBackgroundResource(R.color.textviewbubble);
    //tv.setLayoutParams(llp);
    Resources r = getResources();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
            44, r.getDisplayMetrics());
    tv.setHeight(px);
    return tv;
}

public static Object convertViewToDrawable(View view) {
    int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    view.measure(spec, spec);
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

    Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(),
            view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    c.translate(-view.getScrollX(), -view.getScrollY());
    view.draw(c);
    view.setDrawingCacheEnabled(true);
    Bitmap cacheBmp = view.getDrawingCache();
    Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true);
    view.destroyDrawingCache();
    return new BitmapDrawable(viewBmp);
}  

我尝试使用以下代码设置TextView之间的边距:
 llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 44);
 llp.setMargins(5, 0, 20, 0);
 tv.setLayoutParams(llp);   

我还为TextView设置了LeftPadding,但似乎第一个TextView未能获取它。即使我将高度设置为TextView,但似乎TextView根本没有获取布局参数。像这样:
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
        44, r.getDisplayMetrics());
tv.setHeight(px);

请提供参考资料或提示。
预先感谢。

你能发布你的完整活动吗? - Kailash Dabhi
我已经放置了所有相关的代码。这里没有任何其他内容。 - Sandip Armal Patil
@SandipArmalPatil 什么是标签?它何时更新? - Amulya Khare
当我点击键盘上的搜索键时,标签将被创建。如果我再次输入内容,然后再次点击搜索按钮,则会创建第二个标签。 - Sandip Armal Patil
@SandipArmalPatil 好的,请按照我的答案操作。这应该可以解决你的问题 :) - Amulya Khare
@AmulyaKhare:你删除代码的部分完成了吗?我正在尝试,但是没有得到结果。 - Sandip Armal Patil
1个回答

10

我发现了一些问题。你需要进行指定更改,然后一切都应该能够正常工作。

第一步)更新setBounds参数

在下面这行代码中,将setBounds的参数从-20更新为0,如下所示:

BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
bd.setBounds(0, 0, bd.getIntrinsicWidth(), bd.getIntrinsicHeight());

这很重要,因为你设置了错误的边界,导致标签重叠。

第二步)修复sb.setSpan中的错误

如果你按照第一步操作,并运行代码,你会发现当你尝试用ImageSpan替换文本时,你传递了错误的值(你没有考虑到末尾的“,”(逗号)字符)。更新以下行以包括-1

sb.setSpan(new ImageSpan(bd), sb.length() - tags.length() - 1, sb.length() - 1,
           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
现在,您的输出将会正确显示,并在中间带有逗号。 enter image description here 第三步)在标签之间添加空格 为了回答您最初的问题,如何添加空格,我建议您修改代码,在不同的span之间包括", "。您也可以修改它使用只有" "的空格。定义一个contentBetweenTags变量并将其设置为所需的值。以下是您可以这样做的方式:
String contentBetweenTags = ", ";
sb.append(tags + contentBetweenTags);
sb1 = new SpannableStringBuilder();
sb1.append(tags + contentBetweenTags);
sb.setSpan(new ImageSpan(bd), 
           sb.length() - tags.length() - contentBetweenTags.length(), 
           sb.length() - contentBetweenTags.length(), 
           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

第四步)选择正确的"空格"字符

如果您对两个标签之间的“边距/间距”不满意,您可以使用许多可用的Unicode 空格字符中的任何一个。它们具有不同的宽度,您可以根据自己的喜好使用其中任何一个。

以下是使用 Unicode \u2002 的最终代码和示例截图:

enter image description here

BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
bd.setBounds(0, 0, bd.getIntrinsicWidth(), bd.getIntrinsicHeight());
String contentBetweenTags = ",\u2002";
sb.append(tags + contentBetweenTags);
sb1 = new SpannableStringBuilder();
sb1.append(tags + contentBetweenTags);
sb.setSpan(new ImageSpan(bd), 
           sb.length() - tags.length() - contentBetweenTags.length(), 
           sb.length() - contentBetweenTags.length(), 
           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

你能再帮我一个忙吗?我想使用删除键监听器从可扩展字符串构建器中删除标签,但是遇到了一些问题... 你能添加删除代码吗? - Sandip Armal Patil
我想要的是,假设我有两个标签在EditText中和一些文本...如果我删除一些文本(不是标签),现在EditText只剩下标签。如果我按del键,那么最后一个标签的背景颜色将会改变,如果我再次按del键,那么最后一个标签将从字符串构建器中删除,反之亦然... - Sandip Armal Patil
顺便感谢你的帮助。 - Sandip Armal Patil
我需要查看一下这个问题。当然,没问题。 - Amulya Khare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接