[컴][안드로이드] SlidingDrawer.java local file 로 만들기

local 에서 SlidingDrawer 사용하기 / Custom SlidingDrawer / SlidingDrawer 지원

http://developer.android.com/reference/android/widget/SlidingDrawer.html

SlidingDrawer 를 이제 지원 안하겠다고 한다. 굳이 사용하려면 source 를 app 에 넣어서 사용하라고 한다.
그래서 한 번 넣어봤다.

attrs.xml

여기서 /res/attr.xml 에 넣을 내용을 긁어 오자. orientation 만 아래처럼 수정해 주면 된다.
<declare-styleable name="SlidingDrawer">
        <!-- Identifier for the child that represents the drawer's handle. -->
        <attr name="handle" format="reference" />
        <!-- Identifier for the child that represents the drawer's content. -->
        <attr name="content" format="reference" />
        <!-- Orientation of the SlidingDrawer. -->
        <attr name="orientation">
            <enum name="horizontal" value="0" />
            <enum name="vertical" value="1" />
        </attr>        <!-- Extra offset for the handle at the bottom of the SlidingDrawer. -->
        <attr name="bottomOffset" format="dimension" />
        <!-- Extra offset for the handle at the top of the SlidingDrawer. -->
        <attr name="topOffset" format="dimension" />
        <!-- Indicates whether the drawer can be opened/closed by a single tap
             on the handle.  (If false, the user must drag or fling, or click
             using the trackball, to open/close the drawer.)  Default is true. -->
        <attr name="allowSingleTap" format="boolean" />
        <!-- Indicates whether the drawer should be opened/closed with an animation
             when the user clicks the handle. Default is true. -->
        <attr name="animateOnClick" format="boolean" />
</declare-styleable> 

SlidingDrawer.java

Source code 는 여기서 가져 오자.
그러면 이제 mTop, mBottom, mLeft, mRight 값이 문제가 된다. 이것은 @hide annotation 때문인데, 이녀석은 실제 Android SDK 를 build(compile) 할 때 상속되지 않는다고 한다. 그래서 android.jar 에는 들어있지 않고, 그래서 우리가 상속을 해도 사용할 수 없다고 한다.[ref.1]


그러면 우리는 이 값을 어떻게 얻어와야 하는가.
  • getTop(),
  • getLeft(),
  • getBottom(),
  • getRight()
함수가 존재한다.

이 녀석을 onCreate() 에서 아래처럼 해주면 될 듯 하다.
public SlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
        ...
 mRight = this.getRight();
        mLeft = this.getLeft();
        mBottom = this.getBottom();
        mTop = this.getTop();
 ...
근데 계속 mRight, mLeft, mBottom, mTop 값이 '0' 이 나온다. 한참을 찾다 보니 실제로 화면에 배치(laid) 되지 않은 상태여서 아직 값이 할당되지 않은 상태여서 안된다고 한다. [ref. 2]

해결책은 여러가지가 ref.3 에 나와 있다. 그 중에서 여기서는 화면이 focus 되는 시점에 호출되는
onWindowFocusChanged()
를 이용한다. 이 녀석이 ref.2 에 의하면 가장 확실하게 화면이 user 에게 보여지는 순간을 가리킨다고 한다.[ref. 2]


소스를 참고하자.

Reference

  1. http://stackoverflow.com/questions/4916215/protected-fields-not-visible-to-subclasses
  2. http://stackoverflow.com/questions/8879504/methods-to-get-position-of-view-returns-0
  3. http://stackoverflow.com/questions/4142090/how-do-you-to-retrieve-dimensions-of-a-view-getheight-and-getwidth-always-r

댓글 2개:

  1. java 파일부분이 잘 이해가 안가는데 코드를 가져와서 어디다가 넣어야 하나요?
    그리고 넣고 slidingdrawer사용하듯이 쓰면 되나요?

    답글삭제
  2. 소스를 참고하자. --> 이부분을 봐주세요 ^^ ; 여기서 예제 소스를 download 할 수 있습니다.

    답글삭제