如何设置spannable textview之间的边距?

 JJJppp123 发布于 2023-02-08 10:10

我正在尝试创建spannable textview并在EditText中显示它.因此,用户可以在EditText中输入内容,如果用户按下键盘输入键,那么我将此文本转换为spannable textview后,此用户可以再次开始键入并按键盘输入按钮然后再次第二个spannable textview将创建ans将显示在edittext但是.

哪里卡住?

当我创建两个spannable textview时,这两个textview相互重叠.我想在这两个textview之间设置边距.

我还尝试使用LayoutParam在textview之间设置边距,但没有成功.

这是在EditText中显示textview重叠的图像.

在此输入图像描述

Ÿ是隐藏在下面美味

这是我的代码.

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);

请参考或提示.
提前致谢

1 个回答
  • 我发现了一些问题.您需要进行指定的更改,一切都应该有效.

    步骤1)更新setBounds参数

    在下面的行中,更新setBounds从参数-200如下:

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

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

    步骤2)修复bug sb.setSpan

    如果您按照步骤1运行代码,您将意识到当您尝试替换文本时ImageSpan,您传递的是错误的值(您最后没有考虑","(逗号)字符).更新以下行以包括-1:

    sb.setSpan(new ImageSpan(bd), sb.length() - tags.length() - 1, sb.length() - 1,
               Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    

    现在输出将显示正确,并在中间使用逗号.

    在此输入图像描述

    步骤3)在标签之间添加间距

    要回答原始问题,如何添加间距,我建议您修改代码以包含", "在不同的跨度之间.您也可以修改它以仅使用" "空间.定义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);
    

    步骤4)选择正确的"空格"角色

    如果您对两个标签之间的"边距/间距"不满意,可以使用许多可用的unicode空格字符之一.它们有不同的宽度,你可以根据你的愿望/喜好使用它们中的任何一个.

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

    在此输入图像描述

    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);
    

    2023-02-08 10:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有