textview中的项目符号被截断

时间:2014-04-07 20:39:55

标签: android android-layout textview bulletedlist

我在应用中有一个TextView,其文本由布局中的硬编码字符串资源设置。为了获得TextView中的项目符号列表,我使用了<li>元素的(非官方?)支持。这会根据需要创建正确缩进的子弹,但子弹本身的最左边会略微被切掉,如您所见:

in this image.

我尝试在这些中添加左侧填充,但它对剪裁的边缘没有任何作用 - 只是将整个内部移动。

  1. 有什么简单的解决方案可以解决这个问题吗?
  2. 该项目符号列表的资源在哪里?

3 个答案:

答案 0 :(得分:2)

老问题,但对于其他发现此事的人来说:

我发现内置的BulletSpan类从早期的Android版本一直到marshmallow都有错误:

  • 子弹半径和间隙宽度不会根据dp
  • 进行缩放
  • 子弹有时会被切掉(应该是+ BULLET_RADIUS,而不是* BULLET_RADIUS)

警告:我已经看到一些自定义的BulletSpan类,它们像内部类一样实现ParcelableSpan。这将导致崩溃,并不打算在外部使用。

这是我的BulletSpanCompat:

{{1}}

答案 1 :(得分:0)

尝试使用unicode字符•(Unicode 2022)?看起来您可以将其粘贴到XML中。

http://www.fileformat.info/info/unicode/char/2022/index.htm

答案 2 :(得分:0)

               Please use below code:-

             <CustomBulletTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Point1" />
            <CustomBulletTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Point2" />

           /* CustomBulletTextView.java */
            public class CustomBulletTextView extends TextView {
                public CustomBulletTextView(Context context) {
                    super(context);
                    addBullet();
                }

                public CustomBulletTextView(Context context, AttributeSet attrs) {
                    super(context, attrs);
                    addBullet();
                }

                public CustomBulletTextView(Context context, AttributeSet attrs, int defStyleAttr) {
                    super(context, attrs, defStyleAttr);
                    addBullet();
                }

                public CustomBulletTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
                    super(context, attrs, defStyleAttr, defStyleRes);
                    addBullet();
                }

                private void addBullet() {
                    CharSequence text = getText();
                    if (TextUtils.isEmpty(text)) {
                        return;
                    }
                    SpannableString spannable = new SpannableString(text);
                    spannable.setSpan(new CustomBulletSpan(16), 0, text.length(), 0);
                    setText(spannable);
                }
            }

              /* CustomBulletSpan.java */
            public class CustomBulletSpan implements LeadingMarginSpan, ParcelableSpan {
            private final int mGapWidth;
            private final boolean mWantColor;
            private final int mColor;

            private static final int BULLET_RADIUS = 3;
            private static Path sBulletPath = null;
            public static final int STANDARD_GAP_WIDTH = 2;

            public CustomBulletSpan(int gapWidth) {
                mGapWidth = gapWidth;
                mWantColor = false;
                mColor = 0;
            }

            public int describeContents() {
                return 0;
            }

            public void writeToParcel(Parcel dest, int flags) {
                dest.writeInt(mGapWidth);
                dest.writeInt(mWantColor ? 1 : 0);
                dest.writeInt(mColor);
            }

            public int getLeadingMargin(boolean first) {
                return 2 * BULLET_RADIUS + mGapWidth;
            }

            public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom,
                    CharSequence text, int start, int end, boolean first, Layout l) {
                // Here I shifted the bullets to right by the given half bullet
                x += mGapWidth / 2;
                if (((Spanned) text).getSpanStart(this) == start) {
                    Paint.Style style = p.getStyle();
                    int oldcolor = 0;

                    if (mWantColor) {
                        oldcolor = p.getColor();
                        p.setColor(mColor);
                    }

                    p.setStyle(Paint.Style.FILL);

                    if (c.isHardwareAccelerated()) {
                        if (sBulletPath == null) {
                            sBulletPath = new Path();
                            // Bullet is slightly better to avoid aliasing artifacts on
                            // mdpi devices.
                            sBulletPath.addCircle(0.0f, 0.0f, 1.2f * BULLET_RADIUS, Direction.CW);
                        }

                        c.save();
                        c.translate(x + dir * BULLET_RADIUS, (top + bottom) / 2.0f);
                        c.drawPath(sBulletPath, p);
                        c.restore();
                    } else {
                        c.drawCircle(x + dir * BULLET_RADIUS, (top + bottom) / 2.0f, BULLET_RADIUS, p);
                    }

                    if (mWantColor) {
                        p.setColor(oldcolor);
                    }

                    p.setStyle(style);
                }
            }

            @Override
            public int getSpanTypeId() {
                return 0;
            }

        }