2013-02-21 4 views
1

고유 한 가시성을 결정하는 표시 논리를 가진 사용자 지정 View을 만들고 싶습니다. 그 논리를 유지하고 쉽게 재사용 할 수있게하기 위해 나는 View 서브 클래스를 만들고 getVisibility()을 오버라이드하여 View의 이벤트가 변경되면 가시성이 변경 될 수 있으므로 View을 무효화 할 계획이었습니다. 가시성은 setVisibility()을 호출하고 getVisibility()을 무시하지 말고 변경할 수 있습니다. Romain Guy의 답변 this question을 참조하십시오.사용자 지정보기를 사용하면 고유 한 가시성이 결정됩니다.

setVisibilty()이라고하는 정상적인 View 라이프 사이클/렌더링 프로세스의 일부로 호출되는 특정 메서드가 있습니까? 이미 invalidate()으로 전화 했으므로 이것을 무시하여 setVisibility()을 호출합니다. 하지만 그게 이상적인 곳인가요? invalidate()View의 속성을 설정하는 것이 모범 사례에 위배됩니다.

명확한 설명 : 앙드레 사용자 정의 View의 가시성이 변경 될 수 있습니다 많은 것들이 있다는 것을 지적하고 그 시나리오는 사용자 정의 뷰의 사용이 매우 다릅니다. 그건 사실이야. 하지만이 질문은 방아쇠를 새로 고침하는 모습에 관한 것이 아닙니다. invalidate()은보기의 모양이 변경되었다는 것을 안드로이드에 알리는 표준 방법 인 것 같습니다. 대신 에 대한 모범 사례 질문입니다. View이 무효화 된 후 setVisibility()으로 전화를 걸 때으로 전화를 겁니다. 예를 들어, onMeasure()과 같이 프로세스의 잘못된 부분을 변경하고 싶지는 않습니다. 누구나 링크가 있다면 Android의 UI 렌더링 프로세스 다이어그램을보고 싶습니다.

답변

0

View의 방법으로는 가시성을 다시 계산해야하는 모든 상황을 처리 할 수 ​​없기 때문에 일반적인 방법은 없습니다. (네트워크 작업 상태의 변경과 같은 비동기 이벤트에 대해 생각해보십시오. 또는 간단한 타이머가 꺼지는).

개발자는 가시성을 무효화해야하는 경우가 무엇인지 파악하고 이에 따라 정확하게 가시성을 수정해야합니다. 물론 모든 레이아웃과 드로잉 전에 항상 가시성을 설정할 수는 있지만,

  • 모든 경우를 다루지는 않는다고 생각합니다.
  • 1 ~ 2 달 후에 이해하는 것은 이상 할 것입니다.
  • 이것은 과도한 행동입니다. 귀하가 다루는 모바일 장치이므로 효율성을 높이기 위해 한계를 염두에 두어야합니다.

가시성을 설정 한 후 invalidate()을 호출 한 사실을 실제로 알지 못했습니다. 플랫폼에 의해 자동으로 수행됩니다.

private void invalidateVisibility() { 
    // calculate visibility 
    setVisibility(calculation_outcome); 
    //invalidate(); 
} 

invalidateVisibility()invalidate()에 호출을 변경 : 나는 단순히 제안합니다. 어떤 이유로 든 invalidate()에 정말로 전화해야하는 경우 전화를 거절하십시오. 이것은 아마도 가장 효율적인 솔루션 일 것입니다.

편집 : 당신의 설명 로직이 글을 쓰는 시점에서 (적어도 나를 위해)가 될 것 같았다로 내 대답의

점은 일반적으로 뭔가를 제안했다. invalidate() 메서드에서 중요한 처리가 진행 중이라고 생각하므로 전화해야합니다. 그러나 귀하의 질문에 잠시 동안 나를 괴롭 히고 4 ~ 5 번 읽은 후에, 나는 마침내 당신이 정확히 무엇을 요구하고 있는지 깨달았습니다. :)

내가 제대로 이해하면 View의 가시성이 변경되었을 수 있습니다 때마다 invalidate()를 호출 이미이야. 그 때문에, 단순화를 위해보기 가시성의 변경을 무효화 프로세스에 통합하고자합니다.

그 다음 사건을의 당신이 바로 경우 - invalidate()에서 먼저 완벽하게 확인 그대로 것을하고.

  • View 정상적으로 단순히 "이전에 그룹은"(이 자사의 부모가 다시 칠해야 할 필요성에 대한 알림 도착 볼되고, 그 후 invalidate()를 호출 할 때 : 나는 invalidateVisibility()에 순서대로 정확히 전화를 넣어 이유 보류중인 모든 페인트 작업이 하나의 일괄 처리로 처리되기 때문에). View 보이지 턴온되면
  • 는 자동 무효화를위한 자체 신호를 보낸다. invalidate()에 대한 다른 호출은 단순히 no-op가됩니다.

은 그런 직관있다 -이 :

button.setVisible(false/true); 
button.invalidate(); 

의심스러운 코드가 될 것 같지 않습니다. 그리고 그게 바로 당신의 invalidate()으로 바뀔 것입니다. 그러나 invalidate()이 안드로이드 플랫폼에서 초당 많은 번 호출 할 수 있기 때문에 가시성의 계산이 빠른 작업이 있는지 확인합니다. UI가 애니메이션 인 경우 대부분입니다 (예 : 꼬집기 동작 중에 뷰의 경계를 업데이트합니다.

어떤 방식 으로든 도움이 되길 바랍니다. :)

+0

setVisibility() 이후에 invalidate()를 호출하지 않습니다. 내가 무효화하고 View의 표준 콜백 중 하나에서 가시성을 설정하려고합니다. 나는 이상적인 것을 찾고있다. 제안에 관해서는 invalidateVisibility()가 아무런 이유없이 바퀴를 재발 명하는 것으로 보입니다. invalidate()에 의존하지 않고 표준 프로세스에 묶는 것이 훨씬 더 좋을까요? API 클라이언트가 이러한 일회성 메서드를 호출하도록 요구하면 뷰의 표시 로직에 대한 충분한 통찰력이있어 해당 동작이 View의 가시성에 특별히 영향을 미쳤음을 알 수 있습니다. 일종의 목적을 이겼습니다. – spaaarky21

+0

@ spaaarky21 내 편집을 참조하십시오 – andr

+0

업데이트 해주셔서 감사합니다. 미안하지만 내 질문이 처음에 분명하지 않은 것 같습니다. 반복적으로 호출되는'invalidate()'에 대한 여러분의 마지막 코멘트가 내 생각에 일종의 것이라고 생각합니다. 안드로이드와 같은 API에서, 이상적인 장소가 기존 프로세스와 "결합"되는 곳을 말하기는 때로는 어렵습니다. 어떤 방법은 당신이 기대하는 모든 상황에서 불리지 않을 수도 있고, 어떤 사람들은 너무 자주 호출 될 수도 있습니다. 귀하의 회신에 감사드립니다. – spaaarky21

관련 문제