10

我很好奇 setText() 和 append() 正在创建的差异。我正在编写一个带有行号的非常基本的编辑器。我有一个 TextView 来保存左侧的行号,与右侧的 EditText 配对来保存数据。这是 XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:gravity="top">
    <TextView
        android:id="@+id/line_numbers"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="0dip"
        android:gravity="top"
        android:textSize="14sp"
        android:textColor="#000000"
        android:typeface="monospace"
        android:paddingLeft="0dp"/>
    <EditText
        android:id="@+id/editor"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:inputType="text|textMultiLine|textNoSuggestions"
        android:imeOptions="actionNone"
        android:gravity="top"
        android:textSize="14sp"
        android:textColor="#000000"
        android:typeface="monospace"/>
</LinearLayout>

忽略我正在做的其他一些事情,我遇到的最奇怪的事情是当我使用 append() 时出现的额外间距(假设已经初始化了所有这些)。

下面结合 XML 设置 TextView 和 EditText 之间的齐平边框。

theEditor = (EditText) findViewById(R.id.editor);
lineNumbers = (TextView) findViewById(R.id.line_numbers);
theLineCount = theEditor.getLineCount();
lineNumbers.setText(String.valueOf(theLineCount)+"\n");

但是,将最后一行更改为此,突然 TextView 中的每一行在 EditText 之前的右侧都有填充。

lineNumbers.append(String.valueOf(theLineCount)+"\n");

这不是世界末日。但我很好奇是什么导致了这种行为。由于我是该语言的新手,我唯一能想到的可能是,当 append 在那里抛出 Editable 时,它​​会添加填充。如果我能得到答案,我可以用更简单的追加替换所有这些讨厌的行:

lineNumbers.setText(lineNumbers.getText().toString()+String.valueOf(newLineCount)+"\n");
4

5 回答 5

14
lineNumbers.setText("It is test,");

//这里的lineNumbers有是test

lineNumbers 将具有"It is test,"。之后,如果再次使用 setText,文本将完全改变

lineNumbers.setText("It is second test,");

//在这里你会丢失第一个文本,lineNumbers 文本将是“It is second test”

之后,如果你使用追加,让我们看看会发生什么..

lineNumbers.append("It is third test,");

// 这里你不会丢失lineNumbers 文本。它会像这样 “这是第二次测试,这是第三次测试”

于 2013-10-14T06:16:19.217 回答
6

setText():通过填充要设置的文本来销毁缓冲区内容。 append():将文本添加到缓冲区,然后打印结果。

示例:example.setText("Hello");将在输出屏幕上打印 Hello。如果您随后执行example.append("World");,您将获得 HelloWorld 作为输出。

于 2013-10-14T06:09:57.553 回答
4

setText将用新文本替换现有文本。

来自 Android doc:
设置此 TextView 要显示的文本(请参阅 setText(CharSequence)),还设置它是否存储在可样式/可跨缓冲区中以及是否可编辑。

append将保留旧文本并添加新文本,更像是连接。

来自 Android Doc
的便捷方法:将指定的文本附加到 TextView 的显示缓冲区,如果它还不能编辑,则将其升级为 BufferType.EDITABLE。

于 2013-10-14T06:07:09.583 回答
2

我认为通过 append 方法将 BufferType 更改为 EDITABLE 会导致意外填充。如果您想使用 append 方法而不是 setText 方法并删除该填充,

您可以尝试使用删除它

textView.setincludeFontPadding(false)

或将此行添加到您的 xml 文件中的 textview

android:includeFontPadding="false"

希望这可以帮助。

于 2013-10-14T09:51:30.187 回答
1

基本区别在于setText()替换现有文本中的所有文本append()并将新值添加到现有文本中。希望我有所帮助。

于 2018-03-30T13:48:39.110 回答