Android在TextView中显示文本

时间:2012-11-05 20:43:19

标签: android

大家好,

我正在敲打一个似乎难以理解的问题(也许是我的无知x)。

我有一个TextView,其中我写了一个字符串,我计算可用空间,如果有必要,我将字体大小减小到最小尺寸设置,然后添加一行并继续写。

问题:

编写按钮2和3的字符串,显示TextView的行正确填充:第一行完成,其余字符串在第二行。 ES:

56688+(555556565555566
555555

56688x(555556565555566
555555

编写按钮1和4的字符串,显示TextView的行填充不正确: 第一行填充到'/'或' - '基本上是空的,字符后面的文字在第二行。 ES:

                56688/
(555556565555566555555

                56688-
(555556565555566555555

预期的行为是按钮2和3的字符串。

我无法理解为什么它存在字符'/'和' - '时表现异常,以及如何纠正这种异常现象。

我附上代码:

在文件“activity_main.xml”中,我有一个我在下面报告的自定义组件:

<LinearLayout android:id="@+id/mainLayout" 
android:layout_width="fill_parent"         
android:layout_height="wrap_content" 
androidrientation="vertical"  
android:layout_alignParentTop="true">

<com.example.component.NumTextView
 android:id="@+id/textViewInput"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:focusable="true"
 android:gravity="right"
 android:maxHeight="64dp"
 android:minHeight="64dp"
 app:lines="1"
 app:maxLines="3"
 app:mintextsize="16"
 app:maxtextsize="48"
 androidadding="0dp"
 android:scrollbars="vertical"
 android:singleLine="false" android:text="" />

<View android:layout_width="fill_parent" 
 android:layout_height="1dp"  
 android:background="#000000" />

在继承自“TextView”的类“NumTextView”中,我有以下代码:

private void refitText(String text, int textWidth)
{
 float trySize = 23;
if( textWidth > 0 )
{
int lineCount = this.getLineCount();
this.setLines(lineCount + 1);
this.setVerticalScrollBarEnabled(true);
this.setMovementMethod(ScrollingMovementMethod.get Instance());
this.setTextSize(trySize);
}
}


@Override
protected void onTextChanged(final CharSequence text, final int start, final int before, final int after)
{
refitText( text.toString(), this.getWidth() );
}

最后,在“MainActivity”中,我有以下代码:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textInput = (NumTextView) findViewById(R.id.textViewInput);
}

public void onClick1(View v)
{
String stringa ="56688-(555556565555566555555";
textInput.setText(stringa);
}

public void onClick2(View v)
{
String stringa ="56688+(555556565555566555555";
textInput.setText(stringa);
}

public void onClick3(View v)
{
String stringa ="56688x(555556565555566555555";
textInput.setText(stringa);
}

public void onClick4(View v)
{
String stringa ="56688/(555556565555566555555";
textInput.setText(stringa);
}

1 个答案:

答案 0 :(得分:0)

<强>为什么: 斜杠(/)和连字符( - )是破坏字符,因此它自然会寻求在这些点处打破这些行。这就是自动换行的方式,通过查找断开的字符并在最后适合的断点处插入换行符。

<强>修正吗 如果您可以测量线条以查看每条线上适合的字符数,则可以插入zero-width space(U + 200B)以强制在该点处换行。但是,并非所有字体都支持此字符,因此这可能不适用于所有设备。

如果您无法使用zw-space,或者您对一般的自动调整感兴趣,this question的各种答案可能对您有所帮助。