【问题标题】:how set margin between spannable textview?如何在可跨文本视图之间设置边距?
【发布时间】:2013-12-26 07:07:56
【问题描述】:

我正在尝试创建可跨文本视图并在 EditText 中显示它。因此,用户可以在 EditText 中输入内容,如果用户按下键盘的输入按钮,那么我将在此用户可以再次开始输入并按下键盘的输入按钮之后将此文本转换为可跨文本视图,然后再次第二个可跨文本视图将创建 ans 将其显示在编辑文本但是。

我卡在哪里了?

当我创建两个可跨文本视图时,这两个文本视图会稍微重叠。我想在这两个文本视图之间设置边距。

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

这是在 EditText 中显示 textview 相互重叠的图像。

y of 隐藏在好吃

下面

这是我的代码。

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

请提供参考或提示。
提前致谢

【问题讨论】:

  • 你能发布你的全部活动吗?
  • 我已经放了所有相关的代码。除了这个之外什么都没有。
  • @SandipArmalPatil 什么是标签?什么时候更新?
  • 当我点击键盘的搜索键然后标签将创建。如果我再次输入一些内容,然后再次单击搜索按钮,则会创建第二个标签。
  • @SandipArmalPatil 好的,请按照我的回答。它应该可以解决您的问题:)

标签: android textview margins spannable


【解决方案1】:

我发现了一些问题。您需要进行指定的更改,一切都应该正常工作。

第 1 步)更新setBounds 参数

在以下行中,将setBounds 参数从-20 更新为0,如下所示:

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

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

第 2 步)修复 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);

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

如果您对两个标签之间的“边距/间距”不满意,您可以使用众多可用的unicode space characters 之一。它们有不同的宽度,您可以根据自己的愿望/喜好使用其中任何一种。

这是使用 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);

【讨论】:

  • 您能再帮个忙吗...我想使用删除 ket 侦听器从可跨字符串生成器中删除标签,但遇到了一些问题...您也可以添加删除代码... ...
  • 我想要什么,假设我在 edittext 中有两个标签和一些文本......如果我删除一些文本(不是标签),现在 Edittext 现在只有标签。如果我按 del 那么最后一个标签的背景颜色会改变,如果我再次按 del 那么最后一个标签将从字符串生成器中删除,反之亦然......
  • 顺便感谢您的帮助。
  • 我将不得不看看这个问题。当然没问题。
猜你喜欢
  • 2011-03-27
  • 2016-02-28
  • 2017-10-02
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2016-04-02
  • 2012-07-05
  • 2021-07-23
相关资源
最近更新 更多