2013-05-08 2 views
9

나는 Android에서 사용자 정의보기를 작성했습니다. 이보기의 가시성이 변경되면 일부 처리를 수행해야합니다. 뷰/위젯의 가시성이 변경 될 때 호출되는 리스너가 있습니까?맞춤형 Android보기/위젯의 가시성 변경을 처리하는 방법

편집 :

내가 가시성을 변경하는 방법을 알고

, 우리가보기에 setVisibility 때 호출되는 리스너가 있는지 알고 싶습니다!

+0

좀 더 설명, 내가 가시성을 변경하는 방법을 알고 – cgalvao1993

답변

16

사용자 정의보기 클래스 내에서 처리하려고합니까? 그렇다면 setVisibility() 메서드를 재정의하고 super()를 호출 한 다음 사용자 지정 처리를 수행하는 것이 가장 좋은 이유는 무엇입니까? 내가 가시성을 변경하는 방법을 알고

+0

이 해결책은 블랙 벨트의 상세한 설명 이전에 제공 되었기 때문에 대답으로 표시합니다 – JeeZ

+2

이 방법으로는 작동하지 않습니다. 예를 들어보기의 부모를 보이지 않게 설정하면 해당보기의 가시성 속성을 계속 볼 수 있습니다. 이것을 연습하면 그것이 사실이라는 것을 알게 될 것입니다. – Jacky

0

위젯의 공개 설정을 변경하려면 widget.setVisibility(View.Visible) 또는 widget.setVisibility(View.Invisible) 메소드를 사용하십시오.

+0

은, 우리가보기에 setVisibility 때 호출되는 리스너가 있는지 알고 싶습니다하십시오! – JeeZ

15

은, 우리가보기에 setVisibility 때 호출되는 리스너가 있는지 알고 싶습니다!

당신은 당신의 view/widget를 서브 클래스 화해, setVisibility을 무시하고이 통지를 받아 봐 것이다에 인터페이스를 등록해야합니다. 예 :

public class MyView extends View { 

    public interface MyListener { 
    public void onSetVisibilityCalled(); 
    } 

    public void registerListener(MyListener myListener) { 
    this.mListener = myListener; 
    } 

public void setVisibility (int visibility) { 
    super.setVisibility(visibility); 
    if (mListener != null) 
    mListener.onSetVisibilityCalled(); 
} 

} 
8

수신기를 추가하려는보기를 하위 클래스로 분류해야합니다. 그런 다음 setVisibility 대신 onVisibilityChanged을 무시해야합니다. onVisibilityChanged은 조상보기가 변경된 경우를 포함하여 어떤 이유로 든보기의 가시성이 변경되면 트리거됩니다.

View의 가시성이 변경 될 때 다른 클래스에 알리려면 인터페이스가 필요합니다.

예 :

public class MyView extends View { 
    private OnVisibilityChangedListener mVisibilityListener; 

    public interface OnVisibilityChangedListener { 
    // Avoid "onVisibilityChanged" name because it's a View method 
    public void visibilityChanged(int visibility); 
    } 

    public void setVisibilityListener(OnVisibilityChangedListener listener) { 
    this.mVisibilityListener = listener; 
    } 

protected void onVisibilityChanged (View view, int visibility) { 
    super.onVisibilityChanged(view, visibility); 

    // if view == this then this view was directly changed. 
    // Otherwise, it was an ancestor that was changed. 

    // Notify external listener 
    if (mVisibilityListener != null) 
    mVisibilityListener.visibilityChanged(visibility); 

    // Now we can do some things of our own down here 
    // ... 
} 
} 
관련 문제