Android TextView SetText () останавливает выделение другого TextView — обходной путь?

В настоящее время я играю с функцией выделения Android Textview. Но есть проблема — у меня есть макет, содержащий несколько TextView. К одному из них, который показывает название музыкального файла, я хочу применить функцию выделения. С другой стороны, я продолжаю обновлять текущее время трека (каждую секунду).

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

Есть ли решение для этого?

Я использовал собственный класс для выделения TextView из этого учебника.

Есть ли возможность (может быть, и пользовательский класс), чтобы другой TextView не «воровал» фокус?

Спасибо!

С уважением


person Georg    schedule 11.02.2011    source источник


Ответы (6)


Выделение включается, когда TextView имеет значение setEnabled(true) или получает фокус. Используйте setEnabled(true), чтобы убедиться, что другие TextView не остановят свою область выделения при перемещении фокуса.

person Romain Guy    schedule 11.02.2011
comment
Также проверьте, не перестраивается ли ваше текстовое представление очень часто (например, каждую секунду), не давая времени для запуска бегущей строки: stackoverflow. com/a/13514185/1402641 - person Marcin Koziński; 19.10.2013

В моем случае setEnabled(true) не помог. Ни запрос фокуса, ни что-то в этом роде, потому что с фокусом проблем не было. Я считаю, что выделение также перезапускается всякий раз, когда TextView проходит через onLayout().

В моем случае TextView находился внутри LinearLayout с layout_height="wrap_content". TextView, показывающий время дорожки, был ниже TextView с выделенной областью. Теперь, когда я каждую секунду обновлял нижний TextView, я полагаю, что ОС вычисляла его высоту с нуля, а также вычисляла высоту всего LinearLayout на основе высоты TextView (которая, конечно, была одинаковой каждый раз). Вот почему весь LinearLayout (и его дочерние элементы) получал onLayout(), который перезапускал бегущую строку.

Короче говоря, я установил высоту моего контейнера LinearLayout на фиксированное значение, и выделение начало работать.

person Marcin Koziński    schedule 22.11.2012
comment
Это также устранило мою проблему. Спасибо! - person LowDev1; 26.09.2013
comment
Это сработало для меня. setEnabled(boolean b) не имел никакого эффекта. Спасибо за ответ! - person LyteSpeed; 05.02.2015
comment
Просто хочу добавить, что вы также можете изменить атрибут высоты или ширины текстового представления, для которого вызывается setText. В моем случае я не мог изменить атрибут макета на что-либо другое, кроме wrap_content, из-за проблем с макетом. - person Max Power; 30.11.2019

Но есть проблема — у меня есть макет, содержащий несколько TextView. Я нашел решение здесь: http://androidbears.stellarpc.net/?p=185

Вы должны расширить класс TextView и переопределить несколько методов

@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
    if(focused)
       super.onFocusChanged(focused, direction, previouslyFocusedRect);
}



@Override
public void onWindowFocusChanged(boolean focused) {
    if(focused)
       super.onWindowFocusChanged(focused);
}

@Override
public boolean isFocused() {
       return true;
}
person Bender    schedule 26.09.2012

Вы можете просто requestFocus(); вернуться к TextView, который вы хотите выделить, после обновления нового музыкального TextView. Если вы не можете этого сделать, опубликуйте код, и мы сможем помочь.

TextView.requestFocus()

person Blundell    schedule 11.02.2011
comment
Привет еще раз. Спасибо за быстрый ответ. Я думаю, что я не правильно объяснил, извините. Поскольку я обновляю TextView КАЖДУЮ СЕКУНДУ, бегущая строка даже не начинается, потому что этот цикл обновления слишком быстрый. Вот почему я спрашиваю себя, можно ли обновить TextView, не получая фокуса, чтобы фокусы оставались в TextView, который использует область выделения. - person Georg; 12.02.2011
comment
Как насчет того, что рекомендует Ромен, и установите текстовое представление, которое вы хотите выделить, на setEnabled (true); ? - person Blundell; 12.02.2011

Смотрите мой ответ здесь: https://stackoverflow.com/a/13841982/1823503

Идея такова:

  • программно зафиксировать ширину и высоту
  • установитьSelected
  • переопределить ваш TextView, чтобы исправить проблемы с фокусом
person CmoaToto    schedule 12.12.2012

Вы можете просто обернуть выделение TextView с помощью LinearLayout

person Sujith Manjavana    schedule 01.08.2016