TextView 上的 setText 将覆盖以前的文本

Posted

技术标签:

【中文标题】TextView 上的 setText 将覆盖以前的文本【英文标题】:setText on a TextView will overwrite previous text 【发布时间】:2014-04-17 05:27:24 【问题描述】:

我有一个文本视图,它本身就是线性布局的一部分。 XML 是:

<TextView
    android:id="@+id/label_text"
    android:layout_
    android:layout_
    android:layout_marginTop="3dp"/>

在主程序中,我首先将文本视图设置为一个值:

private TextView character_speaking;

protected void onCreate (Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    character_speaking = (TextView) findViewById(R.id.label_text);
    character_speaking.setText("a text string that was large enough for two lines");

这很好用。

然后我做另一个 setText 以响应按钮按下:

public void handleNextButtonClick(View view) 
    character_speaking.setText("first one line message");

这也很有效

但后来我又做了一个 setText 以响应另一个按钮按下:

public void handlePrevButtonClick(View view) 
    character_speaking.setText("second one line message");

灾难降临。第二行消息覆盖第一行消息而不清除它。

在写第二行消息之前有没有清除第一行消息?

我已经尝试通过使用 EditText 而不是 TextEdit 来解决这个问题,但这是不可接受的,因为它允许用户在字段中写入。

【问题讨论】:

你试过使用 character_speaking.setText("");在你尝试写第二条消息之前? setText() 应该清除上一条消息。你能张贴发生了什么的截图吗?另外,如果你想使用 EditText,你可以设置android:inputType="none",这将禁用编辑。 我不清楚是什么问题,文字是否重叠? 截图会很好。 我刚试过 character_speaking.setText("");在第二条消息之前,行为没有变化。第二条消息写在第一条消息之上。我也尝试过 EditText android:inputType="none" 但这不起作用,因为用户仍然可以触摸 EditText 并弹出一个键盘。 【参考方案1】:

我遇到过类似的问题。让它工作的原因很有趣 -> 我只是在我的布局(LinearLayout)中添加了黑色背景颜色,现在它工作正常。

背景好像没有清除,不知道用什么颜色清除。

【讨论】:

【参考方案2】:

我想我已经决定了一个解决方法。

我将使用 EditText,而不是使用 TextEdit(显然不能用于我想要的)。

<EditText
    android:id="@+id/label_text"
    android:layout_
    android:layout_
    android:hint=""
    android:focusable="false"/>

最后一行是关键。这可以防止用户单击 EditText 并使用键盘破坏文本。

其余代码如您所愿:

private EditText character_speaking;

protected void onCreate (Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    character_speaking = (EditText) findViewById(R.id.label_text);
    character_speaking.setText("a text string that was large enough for two lines");


public void handleNextButtonClick(View view) 
    character_speaking.setText("first one line message");


public void handlePrevButtonClick(View view) 
    character_speaking.setText("second one line message");

一切正常。

【讨论】:

【参考方案3】:

希望这会为您指明正确的方向。

更新 - 工作代码和说明

应用最小sdk为11,目标sdk为19。

我的上一个答案有点失误,因为实际上您无法在 XML 中定义 ViewGroup。所以你必须创建一个带有资源 ID 的基本 LinearLayout。以下是我为您提供的以下 XML。

我希望这正是你要找的我忘了提醒你,你不能在 XML 中定义 ViewGroup,但你必须将你的布局转换为 ViewGroup。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".MainActivity" >

<LinearLayout
    android:id="@+id/textViewHolder"
    android:layout_
    android:layout_
    android:layout_centerInParent="true"
    android:orientation="vertical" >
</LinearLayout>

<LinearLayout
    android:id="@+id/buttonBar"
    android:layout_
    android:layout_
    android:layout_alignParentBottom="true"
    android:orientation="horizontal" 
    style="?android:attr/buttonBarStyle">

    <Button
        android:id="@+id/buttonPrevious"
        android:layout_
        android:layout_
        android:layout_weight="1" 
        android:text="@string/text_Previous"
        style="?android:attr/buttonBarButtonStyle" />

    <Button
        android:id="@+id/buttonNext"
        android:layout_
        android:layout_
        android:layout_weight="1" 
        android:text="@string/text_Next"
        style="?android:attr/buttonBarButtonStyle"/>
</LinearLayout>

我的字符串.xml:

<?xml version="1.0" encoding="utf-8"?>
 <resources>
  <string name="app_name">TextViewSwitcher</string>
  <string name="text_Previous">Previous</string>
  <string name="text_Next">Next</string>
 </resources>

最后是我的 MainActivity.class:

public class MainActivity extends Activity 

// ------------------------------------
// Member Variables

private LinearLayout m_textViewHolder = null;
private Button m_btnPrevious = null;
private Button m_btnNext = null;
private final String m_nothingText = "Nothing Pressed";
private final String m_previousText = "Previous Pressed";
private final String m_nextText = "Next Pressed";


// ------------------------------------
// Class Overrides

@Override protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Get a reference to the UI Elements
    m_textViewHolder    = (LinearLayout) findViewById(R.id.textViewHolder);
    m_btnPrevious       = (Button) findViewById(R.id.buttonPrevious);
    m_btnNext           = (Button) findViewById(R.id.buttonNext);

    // Add Listeners to the Buttons
    m_btnPrevious.setOnClickListener(PreviousListener);
    m_btnNext.setOnClickListener(NextListener);

    // Populate the Initial Layout with a new TextView, & set the Text
    TextView nothingTextView = new TextView(getBaseContext());
    nothingTextView.setText(m_nothingText);
    ((ViewGroup) m_textViewHolder).addView(nothingTextView);



// -----------------------------------------
// Private Methods

// Creates  a new TextView based on the Text Passed in, and returns the new TextView
private TextView createNewTextView(String text)

    TextView newTextView = new TextView(getBaseContext());
    newTextView.setText(text);

    return newTextView;


// Removes the Child Views of the Parent ViewGroup
private void removeChildViewsFromParent()

    ((ViewGroup) m_textViewHolder).removeAllViews();


// -------------------------------------
// Listeners

private OnClickListener PreviousListener = new OnClickListener()

    @Override
    public void onClick(View v) 
    
        removeChildViewsFromParent();
        ((ViewGroup) m_textViewHolder).addView(createNewTextView(m_previousText));

    

;

private OnClickListener NextListener = new OnClickListener()

    @Override
    public void onClick(View v) 
    
        removeChildViewsFromParent();
        ((ViewGroup) m_textViewHolder).addView(createNewTextView(m_nextText));

    

;


抱歉之前的快速回答,但按下按钮时会产生以下结果。

【讨论】:

我尝试这样做但无法解析它。 Android 不允许我将 .setText 添加到 .addView。你能提供更详细的描述吗? 当然我会用一个工作示例更新答案。请给我几分钟。 @CraigRoll 看到上面更新的答案,它有正确的行为。【参考方案4】:

你想清除以前的文字,对吧? 因此,您可以使用 EditText 并使用 editText.getText().clear() 清除视图。

如果不让它可点击,只需使用editText.setFocusable(false)editText.setClickable(false)。我宁愿使用setClickable,但请自己尝试。

【讨论】:

请添加更多解释文本。【参考方案5】:

我遇到了同样的问题,这是由我设置片段的方式引起的。我在布局中同时运行了两个框架。

删除多余的片段后,问题就解决了。

【讨论】:

【参考方案6】:

TextView.setText(String) 方法将始终覆盖已存储的字符串。

在此处查看此方法的文档:http://developer.android.com/reference/android/widget/TextView.html#setText(java.lang.CharSequence)

如果要添加上一个字符串和新字符串,请使用:

TextView.setText(TextView.getText().toString() + String)

【讨论】:

-1 阅读问题。这不是附加文本,而是不清除旧内容

以上是关于TextView 上的 setText 将覆盖以前的文本的主要内容,如果未能解决你的问题,请参考以下文章

为啥 setText() 在 TextView 上的以下代码中不起作用?

TextView系列:setText()与append()

尝试在 recyclerview kotlin 上的空对象引用上调用虚拟方法 'void android.widget.TextView.setText(java.lang.CharSequence)

从活动的片段中的SetText到Textview [重复]

调整大小后 TextView 无法正确换行

如何修复翻译无法使用TextView.setText()?