我正在尝试创建spannable textview并在EditText中显示它。因此,用户可以在EditText中输入内容,如果用户按下键盘输入键,那么我将此文本转换为spannable textview后,此用户可以再次开始输入并按键盘输入按钮然后再次第二个spannable textview将创建ans将显示在edittext但是。
哪里卡住?
当我创建两个spannable textview时,这两个textview相互重叠。我想在这两个textview之间设置边距。
我还尝试使用LayoutParam在textview之间设置边距,但没有成功。
这是在EditText中显示textview重叠的图像。
辣的
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);
请参考或提示 提前致谢
答案 0 :(得分:9)
我发现了一些问题。您需要进行指定的更改,一切都应该有效。
步骤1)更新setBounds
参数
在以下行中,将setBounds
参数从-20
更新为0
,如下所示:
BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
bd.setBounds(0, 0, bd.getIntrinsicWidth(), bd.getIntrinsicHeight());
这很重要,因为您设置了错误的边界,导致标签重叠。
步骤2)修复sb.setSpan
如果您按照步骤1运行代码,则会发现当您尝试使用ImageSpan
替换文本时,您传递的是错误的值(您没有考虑{{1}最后的(逗号)字符)。更新以下行以包含","
:
-1
现在输出显示正确,中间有逗号。
步骤3)在标签之间添加间距
要回答原始问题,如何添加间距,我建议您修改代码以在不同范围之间包含sb.setSpan(new ImageSpan(bd), sb.length() - tags.length() - 1, sb.length() - 1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
。您也可以将其修改为仅使用", "
空格。定义" "
变量并将其设置为所需的值。以下是如何做到这一点:
contentBetweenTags
步骤4)选择正确的"空格" 字符
万一你对'#34;保证金/间距"不满意在两个标签之间,您可以使用众多unicode space characters中的一个。它们有不同的宽度,你可以根据你的愿望/喜欢使用它们中的任何一个。
以下是使用unicode 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);
的最终代码和示例屏幕截图:
\u2002