문제라고 하기보다는 현재 보이는 탭의 옆 탭을 미리 읽어둬서 탭 슬라이드로 넘어갈때 자연스럽게 넘어가게 하는 기술이라 보겠다.
(액티비티 형태의 프로그램만 만지작 하다가 요즘 프래그먼트 형태의 프로그램을 만지작하다보니 삽질의 연속이다.)
하지만 옆 탭이 로딩하는데 통신같은 상당한 시간이 걸리거나, 심지어 프로그래스다이얼로그까지 나타나는 탭이라면 골치가 아파온다.
왜냐! 현재 탭은 이미 화면에 나타나서 잘 보이고 사용자의 입력을 기다릴 타이밍인데,
옆 탭을 미리 로딩하면서 현재화면에 프로그래스다이얼로그가 나타난다? 켁…
(이걸 해결하기 위해 몇시간을 삽질했다… ㅜㅡ 알고보면 이렇게 간단한 것을…. )
(물론, 미리 로딩하는 걸 안하게 프로그램하는 방밥이 있을~지도 모른다…..만 안찾아봤다.. ㅡㅡ)
이제 하나하나 스텝별로 짚고 넘어가 볼까요?
상황을 하나 가정해 본다.
탭이 로딩될때 스레드로 통신을 해서 데이터를 화면에 보여주는 것이라고 하자…
현재 사용자에게 보이는 탭 화면이 자신인지는 다음과 같이 판단한다.
TabActivity는 탭을 감싸고 있는 Activity
tabIdex는 자기 자신이 TabActivity에 붙는 순번(인덱스)
탭이 표시되는 클래스의 onCreate나 onResum이나 onCreateView 등등에 아래와 같은 코드를 넣을 수 있겠죠?
if ( TabActivity.getCurrentPagerPosition() == tabIdx )
{
// 내가 보이고 있다!!! 여기다 프로그래스다이얼로그를 뿌려주면 되것다.
}
else
{
// 내가 보이는 중이 아니라면 미리 읽어들이는 거니깐 프로그래스다이얼로그는 표시하지 말자
}
// 필요한 스레드 생성해서 돌리기
if ( thread == null )
{
thread = new Thread();
thread.start();
}
// 쓰레드 동작 안하는 중
else if ( thread.isAlive() == false )
{
// 앗싸리 새로 생성해서 다시 실행하는게 안전할라나???
thread.start();
}
// 쓰레드가 아직 동작하는 중
else
{
// 아무것도 안해도 되것죠? 이미 스레드가 돌고 있으니깐.
}
이렇게 해놓으면 미리 읽어들이는 중에서는 프로그래스 다이얼로그가 표시되지 않는다.
만일 사용자가 화면을 휙휙휙 넘겨서 쓰레드가 끝나기 전에 해당 화면으로 오면???
프로그래스 다이얼로그가 표시되어야 하는데 표시되지 않고 사용자가 뭔가를 입력할 수 있는 상황이 된다.
어랏??? 이것도 쬐끔 위험한 일이다.. 그래서 막아보자~~~
다음 코드를 넣어주면 된다.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if ( isVisibleToUser )
{
if ( thread != null )
{
// 스레드가 동작중이면
if ( thread.isAlive( ) )
{
// 한번도 표시된 적이 없다면
if ( progressDialog == null )
{
// 조회중 표시
progressDialog = ProgressDialog.show( TabActivity, “통신중”, “조회중…”, true, false );
}
// 표시중이지 않으면
else if ( progressDialog.isShowing() == false )
{
// 조회중 표시
progressDialog = ProgressDialog.show( TabActivity, “통신중”, “조회중…”, true, false );
}
}
}
}
}
마지막으로 이 프로그래스 다이얼로그는 쓰레드 종료 시점에 다음 코드로 종료해 주면 되것다.
if ( progressDialog != null )
{
if ( progressDialog.isShowing() )
{
progressDialog.dismiss();
}
}
작업환경 : 안드로이드 스튜디오 1.1.0
참고자료 : http://stackoverflow.com/questions/9323279/how-to-test-if-a-fragment-view-is-visible-to-the-user
Be First to Comment