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 上的以下代码中不起作用?
尝试在 recyclerview kotlin 上的空对象引用上调用虚拟方法 'void android.widget.TextView.setText(java.lang.CharSequence)