devlog of ShinJe Kim

[TIL] 2020-02-13

|

Today I Learned

  • 프래그먼트를 중첩할 때 add()를 사용하여 중첩하면, 분명 화면에는 새로운 프래그먼트가 나타나는 것 같은데 아래의 프래그먼트 이벤트가 감지되어 에러가 나는 경우가 있다. 원인은 기본 프래그먼트의 속성이 투명으로 되어있어서 그렇다(찾아보자). 이럴 때 새롭게 추가한 프래그먼트에 onclickable=trueonfocusable=true를 추가하면 새로운 프래그먼트가 이벤트를 받아 아래의 프래그먼트에 이벤트가 가지 않는다.

  • 프래그먼트 트랜잭션에서 add()와 replace()의 차이는 무엇일까. add()를 호출하면 기존의 프래그먼트가 소멸되지 않지만 replace()를 호출하면 기존의 프래그먼트가 소멸된다. 즉 기존 프래그먼트를 유지하고 위에 중첩하느냐, 기존 프래그먼트를 소멸하고 새로운 프래그먼트를 갈아 끼우느냐의 차이다. 나는 처음에 당연히 사용하지 않는 자원은 없애는게 좋다고 생각해서 replace()를 자주 사용했는데 그게 아니었다. 다시 사용할 가능성이 크다면 그대로 두는 비용보다 새로 생성하는 비용이 더 높기 때문에 add()를 해 주는 것이 맞다.

  • onCreateOptionsMenu()는 단 한 번 호출되고, onPrepareOptionsMenu()는 매번 menu가 open될 때마다 호출된다. 공식문서의 onCreateOptionsMenu() 설명에 아래와 같이 나와있다.

    This is only called once, the first time the options menu is displayed. To update the menu every time it is displayed, see onPrepareOptionsMenu(Menu).

Comments