我正在尝试创建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)更新setBounds
参数
在下面的行中,更新setBounds
从参数-20
到0
如下:
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);