2011-09-03 1 views
8

다른 곳에서이 질문을했지만 솔루션이 제대로 작동하지 않았습니다. 그래서 더 많은 맥락으로 그것을 다시 포즈. 문제는 활동에 경과 시간 카운터 업데이트 텍스트보기가 표시되어 스크롤되는 음악 제목 텍스트보기가 포함되어 있다는 것입니다.TextView를 설정하면 다른 TextView의 선택 윤곽 스크롤이 중지됨

내 활동 레이아웃에는이 두 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); 

이 재설정하는 것 이외의 실패에 영향을주지 않습니다 다음과 같이이 글의 제안 당

, 나는 커플로 스크롤 제목의 재 활성화와 시간 텍스트의 설정을 시도 scroller가 다시 시작할 때마다.

누락 된 부분이나 잘못 될 수있는 다른 생각이 있습니까? 고마워요!

답변

7

마키는 문제가 있습니다. TextView (또는 TextView가 포함 된 Window)가 포커스를 잃으면 선택 윤곽이 중단되고 재설정됩니다 (TextView의 소스 참조). 난 당신이 여기에 3 가능한 해결책이 추측 :

  1. 당신은 당신의 레이아웃의 다른 모든 뷰에서 android:focusable="false"을 설정할 수 있습니다. 그렇게하면 TextView가 포커스를 잃어서는 안됩니다. 그러나 그것은 아마도 당신이 원하는 해결책이 아닙니다.
  2. 텍스트 뷰를 서브 클래스 화하고 및 onWindowFocusChanged()을 변경하여 선택 윤곽이 중지 및 재설정되지 않도록 할 수 있습니다.
  3. 사용자 고유의 선택 윤곽 구현을 만듭니다.
+7

위의 TextView XML 설정이 런타임 변경없이 작동합니다 (enabled = true 또는 무엇이든지 재설정 할 수 있음). 레이아웃 파일에서 RelativeLayout을 제거하고 LinearLayout으로 대체하는 경우에 그렇습니다. 그리고 위의 제안 1 또는 2 (3 정도는 확실하지 않음)가 작동하지 않으면 작동하지 않습니다. 그것은 RelativeLayout의 미묘하고 가짜 인 문서화되지 않은 실패입니다. 상대 레이아웃을 사용하지 않도록 레이아웃 파일을 재배치하는 것 이외에 다른 해결 방법이 있습니까?심지어 선형 레이아웃만으로 레이아웃 문제를 극복하기 위해 상대 레이아웃을 사용할 필요가 있다는 것을 상기 할 때도 가능하지 않습니다. – Groovee60

+6

이 주셔서 감사합니다. 'RelativeLayout'이 원인입니다. 'LinearLayout'을 사용하는 경우에는 선택 윤곽이 잘 작동하고 다른 뷰를 업데이트해도 문제가 발생하지 않습니다. 이 정보는 자신의 대답을 받아야합니다 ... – Knickedi

5

RelativeLayout을 모두 제거하지 않고도이를 해결할 수있는 또 다른 방법이 있습니다.

RelativeLayout 내부의 LinearLayout을 사용하여 선택 윤곽 TextView를 컨테이너로 간단하게 래핑 할 수 있습니다.

+0

이것은 매력처럼 작동합니다. 고마워요! –

+0

지금까지 가장 좋은 답변입니다! –

2

(답변에 위의 설명에 승격) 런타임 레이아웃을 변경하지 않고 위의 TextView XML 구성이 작동하는지 확인합니다 (enabled = true 또는 무엇이든 재설정). 레이아웃 파일에서 RelativeLayout을 제거하고 LinearLayout의 것. 그리고 위의 제안 1 또는 2 (3 정도는 확실하지 않음)가 작동하지 않으면 작동하지 않습니다. 그것은 RelativeLayout의 미묘하고 가짜의 문서화되지 않은 실패처럼 보입니다.

관련 문제