setText() 和 append() 的区别

Posted

技术标签:

【中文标题】setText() 和 append() 的区别【英文标题】:Difference between setText() and append() 【发布时间】:2013-10-21 15:36:07 【问题描述】:

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_ 
    android:gravity="top">
    <TextView
        android:id="@+id/line_numbers"
        android:layout_
        android:layout_
        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_
        android:layout_
        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");

【问题讨论】:

【参考方案1】:
lineNumbers.setText("It is test,");

//这里lineNumbers有是测试

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

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

//这里你会丢失第一个文本和lineNumbers文本将是“这是 第二次测试,”

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

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

// 这里你不会丢失 lineNumbers text.. 会是这样的 “第二次测试,第三次测试”

【讨论】:

【参考方案2】:

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

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

【讨论】:

没有以任何方式解决问题的内容(可能是标题,但不是确切问题的描述)【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

您可以尝试使用删除它

textView.setincludeFontPadding(false)

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

android:includeFontPadding="false"

希望这会有所帮助。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于setText() 和 append() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

TextView系列:setText()与append()

settext和maketext的区别

在 Python 中,“.append()”和“+= []”有啥区别?

Memo1.Lines.Add(s) 与 Memo1.Lines.Append(s) 的区别是什么?

控件setText与setValue赋值顺序先后区别

StringBuilder的append方法和String+String的区别