添加 BulletSpan 时 EditText 不增加宽度

Posted

技术标签:

【中文标题】添加 BulletSpan 时 EditText 不增加宽度【英文标题】:EditText not increasing width when adding BulletSpan 【发布时间】:2015-01-26 03:30:15 【问题描述】:

将 BulletSpan 添加到 EditText 时,EditText 的大小不会随着项目符号添加的前导空格而增加。这会导致文本的换行或滚动看不见。

到目前为止,我无法强制 EditText 正确重新测量其宽度。

不幸的是,我没有足够的声誉来说明这种情况。让我试着描述一下情况。

    将 BulletSpan 添加到 EditText 的底层 Editable 时,生成的较大段落会在右边缘后面滚动。

    |0123456789|  -> | • 0123456|789  
    

    最后一个字符在右边缘后面滚动。

    当更改的可编辑项分配给 EditText 时,字段的宽度保持不变,并且更宽的文本换行。

    |0123456789| -> | • 0123456|
                    |   789    |
    

    在这两种情况下,EditText 都不补偿前导空间的宽度。

    在段落末尾添加额外的字符

    | • 0123456789xxx|
    |   xxx          |
    

    向 EditText 添加字符时,字段的大小会按预期增加,但不会考虑项目符号的添加空间及其边距并保持换行。

有人问过关于 BulletSpan 的几个问题,但之前没有问过这种奇怪的行为。 这两天,我在xml中尝试了很多布局设置,在代码中尝试了很多选项,不幸的是都没有成功。

有人有什么建议吗?

代码:MainActivity.java

        mToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean showBullet) 
            final Editable editable = mEditText1.getText();

            if (showBullet) 
                // Add bullet
                editable.setSpan(new BulletSpan(50), 0, editable.length(), Spannable.SPAN_PARAGRAPH);
             else 
                // Remove bullet
                BulletSpan[] spans = editable.getSpans(0, editable.length(), BulletSpan.class);
                if (spans.length > 0) 
                    editable.removeSpan(spans[0]);
                
            
            // See what happens when assigning the editable to an other TextView
            mEditText2.setText(editable);
        
    );

布局:activity_main.xml(部分)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relative_layout"
android:layout_
android:layout_
android:paddingLeft="10dp"
android:paddingRight="10dp"> 

<!-- ToggleButton and TextView removed -->

<EditText
    android:id="@+id/editText"
    android:layout_
    android:layout_
    android:layout_below="@+id/textView"
    android:inputType="textMultiLine"
    android:text="0123456789" />

【问题讨论】:

【参考方案1】:

尝试覆盖BulletSpan 方法并更改其实现:

public class MyBulletSpan extends BulletSpan 

    @Override
    public int getLeadingMargin(boolean first) 
        return super.getLeadingMargin(first);
    

    @Override
    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) 
        super.drawLeadingMargin(c, p, x, dir, top, baseline, bottom, text, start, end, first, l);
    

【讨论】:

以上是关于添加 BulletSpan 时 EditText 不增加宽度的主要内容,如果未能解决你的问题,请参考以下文章

添加一个新的 CheckBox 和一个 editText 视图,当用户在 android 的键盘上点击 Done 时?

Android EditText 中文本更改时自动添加千位分隔符

如何在android中动态添加edittext?

如何在 TableLayout 中添加 editText.addTextChangedListener

如何在 android 小部件 EditText 中添加水印?

聚焦时如何隐藏edittext的线条颜色