출처
: http://blog.elegwance.com/post/92780332098/android-up-button-navigation
: http://blog.swcode.net/entry/Up-네비게이션-사용하기
참고 자료
: http://klutzy.nanabi.org/android-design-ko/patterns/navigation.html
Introduction
안드로이드 3.0 버젼부터 ActionBar가 추가되면서 Activity 간의 전환 방식이 크게 바뀌었다.
기존에는 Back 버튼에만 의존하였으나 Up 버튼이 추가됨에 따라 네비게이션 패턴이 다양해지게 되었다.
Up 버튼과 Back 버튼은 겉으로 보기엔 유사한 동작처럼 보일 수 있으나, 의외로 복잡한 구석이 있어 안드로이드 가이드라인를 참조하여 일관성 유지를 위해 세밀한 설계가 필요하다.
How does it work?
Up 버튼의 동작 방식은 크게 두 가지로 나눌 수 있다.
- AndroidManifest.xml에 지정된 Parent Activity로 이동. (Static)
- Activity의 getParentActivityIntent method에서 반환한 Intent를 호출. (Dynamic)
앱 내의 네비게이션 구조가 간단한 경우에는 1번의 방법을 이용하여 부모를 선언하면 간단하게 처리 될 수 있다.
Providing Up Navigation 참조.
앱 내의 네비게이션 구조가 복잡한 경우1에는 어디에서 실행 되었는지에 따라 Up 버튼이 호출해야 할 Intent가 달라지기 때문에
Runtime 시점에서 이를 결정해야 함으로, Activity의 method를 상속하여 이를 알려줘야 한다.
Implementation
1) Activity가 앱 내부에서 호출 되는 경우
Up 버튼을 클릭하면 System은 getParentActivityIntent을 호출하여 Parent Intent가 무엇인지 확인한다.
이 method를 Override하여 원하는 Intent를 반환하면 된다.
(super method를 사용할 경우에는 AndroidManifest에 정의된 Parent Activity의 Intent를 반환한다.)
@Override
public Intent getSupportParentActivityIntent() {
if (hasAnotherParent()) {
return new Intent(this, AnotherParentActivity.class);
}
return super.getSupportParentActivityIntent();
}
2) Activity가 앱 외부에서 호출 되는 경우
해당 앱의 Task가 아닌 곳에서 Activity가 실행 되고 있는 경우, 즉 외부 앱에 의해 호출된 경우에는onCreateNavigateUpTaskStack method가
호출된다. 파라미터로 넘어온 TaskStackBuilder를 Implement하여 앱 내부에서 호출 된 경우 동일하게 동작하게 처리해야만 한다.
@Override
public void onCreateNavigateUpTaskStack(TaskStackBuilder builder) {
builder.addNextIntentWithParentStack(
new Intent(this, AnotherParentActivity.class)
);
}
만약 getSupportParentActivityIntent를 Override하고 AndroidManifest에 “default” Parent Activity를 선언했다면,
onCreateNavigateUpTaskStack을 굳이 구현하지 않아도 된다.
onCreateNavigateUpTaskStack에서 manifest에서 선언된 parent activity를 기반으로 back stack을 동기화한다.
참조 1) Support Library를 사용하고 있다면 android.support.v7.app.ActionBarActivity를 상속하여
getSupportParentActivityIntent와 onCreateSupportNavigateUpTaskStack을 구현하면 된다.
참조 2) 여러 개의 Activity가 아닌 Fragment를 이용한 앱 네비게이션 계층을 가지고 있다면 위의 방법은 적절하게 동작하지 않는다.
fragment의 parent로 이동하기 위해서는 onNavigateUp과 popBackStack method를 이용해야 한다.
안드로이드에서 Up 네비게이션을 사용할 때 안드로이드 버전에 따라 작성하는 방법이 다르다.
안드로이드 버전이 4.1 이상일 경우 AndroidManifest.xml에 다음 한 줄을 추가해주면
부모 Activity가 지정됨과 동시에 Up 네비게이션도 사용 가능해 진다.
안드로이드 버전이 4.0 이하일 경우 <meta-data /> 속성을 이용해서 부모 Activity를 지정해 주어야 한다.
부모 Activity 설정이 끝이 나면 onCreate() 메소드 내부에 setDisplayHomeAsUpEnabled()를 사용하여 Up 버튼을 적용시킨다.
여기까지 작성하면 작동되지 않는 Up 버튼이 생성된다.
이 버튼을 눌렀을 때 이벤트를 작성하기 위해서는 onOptionsItemSelected() 메소드를 오버라이드 하여 사용한다.
switch 문에서 눌러진 item의 값을 받아와서 해당 값이 만약 android.R.id.home 즉 Up 네비게이션 버튼일 경우 아래 코드를 수행하게 된다.
이 때 만약 minSdkVersion이 11 미만일 경우 getActionBar() 메소드에서 에러가 발생하게 되는데
다음과 같이 SuppressLint를 import 시켜주고 @SuppressLint를 추가해 주면 된다.
'IT_Programming > Android_Java' 카테고리의 다른 글
[펌][안드로이드] ScrollView 자동 스크롤 애니메이션 (0) | 2016.02.25 |
---|---|
Android Touch Intercept 사용하기 (0) | 2016.02.15 |
안드로이드 6.0 마시멜로 무엇을 테스트 할까요? (0) | 2016.01.28 |
[펌] RecyclerItemClickListener - RecyclerView에서 OnItemClickListener 구현 (0) | 2016.01.22 |
[펌] 안드로이드 Doze / Stand By 모드 정리 (0) | 2016.01.21 |