如何删除TextView的旧行

我正在开发一个应用程序,不断需要显示结果给用户在一个TextView像某种日志。

该应用程序很好地工作,它显示在TextView中的结果,但只要它继续运行和添加行应用程序变得更慢,崩溃,因为TextView的字符长度。

我想知道如果android API提供了任何方式来强制TexView自动删除为了腾出空间来引入新的最古老的行。

Solutions Collecting From Web of "如何删除TextView的旧行"

我有同样的问题。 我刚刚解决了。

诀窍是使用TextView的getEditableText()方法。 它有一个replace()方法,甚至是一个delete()方法。 当你在其中追加getEditableText() ,TextView已经被标记为“editable”,这是使用getEditableText()所必需的。 我有这样的事情:

 private final static int MAX_LINE = 50; private TextView _debugTextView; // Of course, must be filled with your TextView public void writeTerminal(String data) { _debugTextView.append(data); // Erase excessive lines int excessLineNumber = _debugTextView.getLineCount() - MAX_LINE; if (excessLineNumber > 0) { int eolIndex = -1; CharSequence charSequence = _debugTextView.getText(); for(int i=0; i<excessLineNumber; i++) { do { eolIndex++; } while(eolIndex < charSequence.length() && charSequence.charAt(eolIndex) != '\n'); } if (eolIndex < charSequence.length()) { _debugTextView.getEditableText().delete(0, eolIndex+1); } else { _debugTextView.setText(""); } } } 

事情是, TextView.getLineCount()返回包装的行数,而不是文本中的“\ n”的数量…这就是为什么我清除整个文本,如果我到达文本的结尾,而寻求行删除。

您可以通过删除多个字符而不是删除多行来做到这一点。

此解决scheme跟踪列表中的日志行,并在每次更改时用该列表的内容覆盖textview。

 private List<String> errorLog = new ArrayList<String>(); private static final int MAX_ERROR_LINES = 70; private TextView logTextView; public void addToLog(String str) { if (str.length() > 0) { errorLog.add( str) ; } // remove the first line if log is too large if (errorLog.size() >= MAX_ERROR_LINES) { errorLog.remove(0); } updateLog(); } private void updateLog() { String log = ""; for (String str : errorLog) { log += str + "\n"; } logTextView.setText(log); } 

TextView显示通过setText()方法设置的内容。 所以这听起来像你应该减less你提供的input。

要清空TextView,你可以做setText("");

下面是一个例子,它将行添加到由设置的最大行限制的输出日志中。 每添加一行,滚动视图都会自动滚动到底部。 这个例子纯粹使用TextView的内容,所以它不需要单独的数据收集。

将以下内容添加到您的活动xml中:

 <ScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="vertical" > <TextView android:id="@+id/textViewOutput" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="1000" /> </ScrollView> 

在你的活动中添加下面的代码:

 private static final int MAX_OUTPUT_LINES = 50; private static final boolean AUTO_SCROLL_BOTTOM = true; private TextView _textViewOutput; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); _textViewOutput = (TextView) findViewById(R.id.textViewOutput); } //call to add line(s) to TextView //This should work if either lineText contains multiple //linefeeds or none at all private void addLinesToTextView(String lineText) { _textViewOutput.append(lineText); removeLinesFromTextView(); if(AUTO_SCROLL_BOTTOM) _scrollView.post(new Runnable() { @Override public void run() { _scrollView.fullScroll(ScrollView.FOCUS_DOWN); } }); } // remove leading lines from beginning of the output view private void removeLinesFromTextView() { int linesToRemove = _textViewOutput.getLineCount() - MAX_OUTPUT_LINES; if (linesToRemove > 0) { for (int i = 0; i < linesToRemove; i++) { Editable text = _textViewOutput.getEditableText(); int lineStart = _textViewOutput.getLayout().getLineStart(0); int lineEnd = _textViewOutput.getLayout().getLineEnd(0); text.delete(lineStart, lineEnd); } } } 

我想你使用TextView.append(string)然后它会添加到旧文本。
如果您使用setText进行设置,则会replace旧文本

这是一个旧的,但我发现寻找解决我自己的问题。

我能够使用nameoflayout.removeAllViews();LinearLayout删除所有的TextView nameoflayout.removeAllViews();

还有一种方法可以让你使用整数从布局的指定位置删除视图,它是: nameoflayout.removeViews(start, count); 所以我相信你可以创build一个超时的textviews保持可见多久。

不,android API不提供从textview中自动删除最早的行到API级别25的任何function。您需要在逻辑上做到这一点。

尝试编写一个函数,使TextView上的旧string,并添加新的string,然后得到子string的TextView能够最后的string。 并将其设置为TextView 。 像这样的东西:

 String str = textview.getText(); str += newstring; int ln = str.length(); ln = ln-250; if (ln<0) ln=0; str = str.substring(ln); textview.setText(str);