Как удалить старые строки TextView - PullRequest
7 голосов
/ 22 февраля 2011

Я разрабатываю приложение, которому постоянно нужно показывать результаты пользователю в TextView, как в каком-то журнале.

Приложение прекрасно работает и показывает результаты в TextView, но до тех пор, покаон продолжает работать и добавлять строки, приложение становится медленнее и вылетает из-за длины символов TextView.

Я хотел бы знать, предоставляет ли API-интерфейс Android какой-либо способ заставить TexView автоматически удалять самые старые строки, которыебыли введены для того, чтобы освободить место для новых.

Ответы [ 9 ]

8 голосов
/ 25 апреля 2012

У меня была такая же проблема.Я только что решил.

Хитрость заключается в использовании метода getEditableText() TextView.У него есть метод replace(), даже метод delete().Когда вы добавляете в него строки, TextView уже помечается как «редактируемый», что необходимо для использования 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" в тексте ... Именно поэтому я очищаювесь текст, если я доберусь до конца текста при поиске строк для удаления.

Вы можете сделать это по-другому, удалив несколько символов вместо стирания количества строк.

7 голосов
/ 10 октября 2012

Это решение отслеживает строки журнала в списке и перезаписывает текстовое представление содержимым списка при каждом изменении.

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);
}
1 голос
/ 09 августа 2013

Вот пример, который добавляет строки в выходной журнал, ограниченный установленным максимальным количеством строк. Прокрутка автоматически прокручивается до конца после добавления каждой строки. Этот пример работает исключительно с содержимым 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);
        }
    }
}
1 голос
/ 22 февраля 2011

TextView показывает, что вы установили с помощью метода setText(). Так что для меня это звучит так, как будто вы должны сократить ввод, который вы предоставляете.

Чтобы очистить TextView, вы можете сделать setText("");

0 голосов
/ 27 июня 2018

ссылка Винсента Хирибаррена.сделай это проще ->

TextView _debugTextView; //if excess 20 lines keep new 200 chars if(_debugTextView.getLineCount() >20) _debugTextView.getEditableText().delete(0,_debugTextView.getText().length()-200);

0 голосов
/ 21 сентября 2017

Нет, API-интерфейс Android не предоставляет никаких функциональных возможностей, которые автоматически удаляют самые старые строки из textview до уровня API 25. Вы должны сделать это логически.

0 голосов
/ 25 марта 2012

Попробуйте написать функцию, которая берет старую строку в TextView и добавить к ней новую строку, а затем получить подстроку последней строки, которая поддерживает TextView.И установите его на 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);  
0 голосов
/ 25 марта 2012

Это старый, но я только что нашел решение своей проблемы.

Мне удалось удалить все TextViews из LinearLayout, используя nameoflayout.removeAllViews();

Существует еще один метод, который позволит вам удалять представления из указанных мест в макете с использованием целых чисел, это: nameoflayout.removeViews(start, count);, поэтому я уверен, что вы можете создать тайм-аут для того, как долго текстовые представления остаются видимыми.

0 голосов
/ 22 февраля 2011

Я думаю, что вы используете TextView.append(string), тогда он добавит к старому тексту.
Если вы используете setText, он заменит старый текст

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...