[Android] Lollipop 버전에서 Support Fragment 화면 갱신이 안될때(ListView, Button 등)

Posted by Find my true self Fimtrus
2017.04.20 16:32 Programming/Android

요즘 안드로이드 개발 추세는 Activity 위에 Fragment를 올리는 형태를 많이 취한다.


그리고 많은 단말기를 지원하기 위해 Support Activity, Support Fragment를 사용한다.



Activity는 FragmentController 역할을, Fragment는 뷰를 제어한다.


나도 위와 같은 형태로 안드로이드 앱 개발을 진행하는데, 가끔 생각지 못한 버그를 접하게 된다.


최근 개발 중에 Fragment의 화면이 갱신이 되지 않는  버그를 접했다.


플래그먼트에 리스트뷰, 그리고 토글 버튼들을 배치 하였는데, 


이벤트는 발생을 하나, 화면이 새로 그려지지 않았다.


문제는 FragmentManager를 통해 다른 플래그먼트를 불러오는데,


애니메이션을 적용하게 되면, 새로 불려진 플래그먼트 화면이 갱신이 되지 않았다.


모든 단말기에서 발생하는 문제는 아니고, 특정단말기(롤리팝)에서만 발생하는 이슈였는데 동작하지 않는 이유에 대해 찾기가 쉽지 않았다.



/*
 * 문제의 코드
 */ 
getFragmentManager().beginTransaction()
                .setTransition(FragmentTransaction.
                        TRANSIT_FRAGMENT_FADE)
                .addToBackStack("test")
                .replace(R.id.layout_content, new TestFragment()).commit();


위 코드의 문제점은 setTransition 메소드를 사용하여 플래그먼트가 전환될 때 애니메니션을 적용시켰다는 점이다.


좀 예쁘게 만들려고 적용시켰더니....


그래서 setTransition코드를 제거하고 빌드하니 정상적으로 동작하는 것을 확인할 수 있었다..


/*
 * setTransition 주석 처리..
 */ 
getFragmentManager().beginTransaction()
//                .setTransition(FragmentTransaction.
//                        TRANSIT_FRAGMENT_FADE)
                .addToBackStack("test")
                .replace(R.id.layout_content, new TestFragment()).commit();


Support Library를 사용하여 개발하게 되면 보다 편리하게 구현할 수 있지만


가끔 이런 난감한 문제에 봉착할때가 있다는 사실을 다시금 깨닫게 해주는 이슈였다.



이 댓글을 비밀 댓글로

[Android] Notification 에서 onNewIntent가 타지 않는 문제. How to call onNewIntent from Notification.

Posted by Find my true self Fimtrus
2014.06.26 11:40 Programming/Android

launchMode 가 singleTask 혹은 singleTop 인 Activity에 intent를 보내게 되면,


존재 할 경우 onNewIntent, 존재하지 않을 경우 Activity가 새로 시작하게 된다.


일반적인 방법으로 액티비티를 호출할 때에는 startActivity로 호출하지만,


Notification을 통해 호출할 경우 PendingIntent를 사용하는데,


액티비티의 모드가 singTask, singleTop 이며 존재하는데도 


강제로 액티비티를 재시작시키는 경우가 있다.

(아마도..안드로이드 레퍼런스에 코드만 보고 만들어서 그런건 아닐까 생각이 든다.)


정상적인 Activity lifecycle을 태우기 위해선, PendingIntent 생성시 requestCode를 반드시 넣어야한다.

(대부분 default값으로 0을 넣는다)




대부분 REQUEST_CODE 부분에 0 을 넣는데, private 한 값을 추가시켜주면, 정상적으로 onNewIntent가 불린다.

PendingIntent resultPendingIntent = PendingIntent.getActivity(
        context, REQUEST_CODE, 
        resultIntent, 
        PendingIntent.FLAG_UPDATE_CURRENT);



이 댓글을 비밀 댓글로
    • 날개
    • 2014.11.07 15:14
    private 한 값이 무엇인가요 ?
    • 2015.10.06 09:54
    비밀댓글입니다