Установка TextView останавливает прокрутку выделенного текста другого TextView - PullRequest
8 голосов
/ 03 сентября 2011

Это спрашивали в другом месте, но решение не сработало для меня.Таким образом, представляя это снова с большим контекстом.Проблема состоит в том, что действие содержит прокручиваемое текстовое представление заголовка музыки, которое прерывается обновлением текстового представления счетчика истекшего времени.

У меня есть эти два виджета TextView в моем макете активности (хотя они включены в другие контейнеры макета)).

<TextView android:id="@+id/v_current_time"
   android:minWidth="26dp"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical"
   android:gravity="right|center_vertical"
   android:singleLine="true"
   android:textSize="12sp"
   android:enabled="false"
  />

<TextView android:id="@+id/v_track_title"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textSize="18sp"
   android:textStyle="normal"
   android:singleLine="true"
   android:ellipsize="marquee"
   android:marqueeRepeatLimit="marquee_forever"
   android:scrollHorizontally="true"
   android:focusable="true"
   android:focusableInTouchMode="true"
   android:enabled="true"
/>

Название музыки динамически устанавливается на (в тестовом примере) длинную строку текста.Если я никогда не обновлю текст текущего времени следующей строкой, название музыки будет счастливо прокручиваться вечно, независимо от того, как я взаимодействую с кнопками паузы и воспроизведения.

tvCurrentTime.setText(DataFormat.formatTime(progress));

Но если я установлю текстна текущий момент название музыки остановится.Нажатие на мою кнопку паузы как-то запускает прокрутку назад на передачу, но нажатие на воспроизведение заставит текущее время обновиться и снова его остановить.

В соответствии с предложением в этой теме я попытался соединить настройку текста времени сповторное включение заголовка прокрутки следующим образом:

tvCurrentTime.setText(DataFormat.formatTime(progress));
tvTitle.setEnabled(true);

Это не влияет на сбой, кроме сброса скроллера при каждом его перезапуске.

Есть ли какие-то подробности, которые яотсутствует или какие-либо другие мысли о том, что может пойти не так?Большое спасибо!

Ответы [ 4 ]

7 голосов
/ 04 сентября 2011

Шатер проблематичен. Когда TextView (или Окно, содержащее TextView) теряет фокус, выделение останавливается и сбрасывается (см. Источники для TextView). Я думаю, у вас есть 3 возможных решения здесь:

  1. Вы можете установить android:focusable="false" во всех других видах в макете. Таким образом, ваш TextView не должен терять фокус. Но это, вероятно, не то решение, которое вы хотите.
  2. Вы можете создать подкласс TextView и изменить onFocusChanged() и onWindowFocusChanged(), чтобы предотвратить остановку и сброс маркера.
  3. Создайте собственную реализацию marquee.
6 голосов
/ 05 февраля 2014

Есть еще один способ решить эту проблему, не удаляя все RelativeLayout.

Вы можете просто обернуть выделенное TextView с помощью LinearLayout внутри RelativeLayout в качестве контейнера.

2 голосов
/ 10 марта 2015

(Повышение комментария выше к ответу) Оказывается, что конфиги TextView XML выше работают нормально без каких-либо изменений во время выполнения (для сброса enabled = true или чего-либо еще), ЕСЛИ я избавляюсь от RelativeLayout в моем файле макета и заменяю их на LinearLayout's,И ни одно из предложений 1 или 2 выше (не уверен насчет 3) не сработает, если я этого не сделаю.Это похоже на тонкий и поддельный недокументированный провал RelativeLayout.

0 голосов
/ 25 мая 2018

В Java-коде выполнение tvTitle.setSelected(true); (здесь tvTitle - ваша скользящая переменная TextView) сработало для меня.Делая это, кажется, снова фокусируется.Так сработало как шарм.

...