여러 개의 액티비티로 구성된 프로그램은 실행 중인 액티비티의 목록을 스택에 저장한다.
프래그먼트도 액티비티와 마찬가지로 스택에 저장된다.
현재 상태를 스택에 저장하려면 다음 메소드를 사용한다.
FragmentTransaction addToBackStack(String name)
name은 스택의 상태에 대해 이름을 주는데 사용된다.(필요 없으면 null)
스택에 프래그먼트를 저장한 상태에서 사용자가 Back 버튼을 누르면 스택의 최상위에 있는 프래그먼트를 꺼내 원래 상태로 복귀한다.
FragmentTransaction setTransition(int transit)
FragmentTransaction setCustomAnimations(int enter, int exit [, int popEnter, int popExit]
위 메소드를 이용해서 프래그먼트 전환시에 애니메이션을 지정할 수 있다.
다음 예제는 addToBackStack 메소드를 이용해서 백(Back)키를 누르면 이전의 프래그먼트를 가져오는 예제이다.
이번 예제는 다음과 같이 4개의 파일을 만들어야 한다.
activity_back_stack.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/btnadd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="mOnClick"
android:text="Add"
/>
<FrameLayout
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
counterfragment.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:background="#ffff00"
>
<TextView
android:id="@+id/txtcounter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff0000"
android:textSize="40sp"
android:text="0"
/>
<Button
android:id="@+id/btnincrease"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Increase"
/>
</LinearLayout>
CounterFragment.java
package com.example.ch20_backstack;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class CounterFragment extends Fragment{
//인스턴스 만들고 아규먼트에 값을 넣어두는 메소드
public static CounterFragment newInstance(int start){
CounterFragment cf = new CounterFragment();
Bundle args = new Bundle();
args.putInt("start", start);
cf.setArguments(args);
return cf;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
View root = inflater.inflate(R.layout.counterfragment, container,
false);
Button btnIncrease = (Button)root.findViewById(R.id.btnincrease);
final TextView textCounter = (TextView)root.findViewById(R.id.btnincrease);
int start = 0;
Bundle args = getArguments();//여기서 아까 저장한 값을 가져옴
if(args != null){//값이 있다면
start = args.getInt("start");//start 태그의 값을 취함
}
textCounter.setText(Integer.toString(start));//버튼의 텍스트를 바꿈
//버튼클릭 리스너 등록
btnIncrease.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
int count = Integer.parseInt(textCounter.getText().toString());
textCounter.setText(Integer.toString(count + 1));
}
});
return root;
}
}
BackStack.java
package com.example.ch20_backstack;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
public class BackStack extends Activity {
int mStart = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_back_stack);
if(savedInstanceState != null){
mStart = savedInstanceState.getInt("mStart");
}
//프래그먼트 매니저 사용을 위한 구문
FragmentManager fm = getFragmentManager();
FragmentTransaction tr = fm.beginTransaction();
CounterFragment cf = CounterFragment.newInstance(mStart);
tr.add(R.id.frame, cf).commit();//cf를 frame레이아웃에 더함(겹침)
}
//상태를 저장하기 위한 부분
//장비의 설정 상태 변경, 화면 방향 변경 등의 변화에 의해 프래그먼트가
//정지될 때 호출됨.
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putInt("mStart", mStart);//mStart값을 넣어둠
}
//Add버튼 클릭시
public void mOnClick(View v){
switch(v.getId()){
case R.id.btnadd:
mStart += 10;//mStart값 증가
//프래그먼트 매니저를 가져옴
FragmentManager fm = getFragmentManager();
FragmentTransaction tr = fm.beginTransaction();
CounterFragment cf = CounterFragment.newInstance(mStart);//mStart값 저장
tr.replace(R.id.frame, cf);//cf를 교체함
//백스택에 넣어둠 이것때문에 백(Back)키를 누르면 이전 프래그먼트를 가져오게됨.
tr.addToBackStack(null);
tr.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);//애니메이션 효과
tr.commit();
break;
}
}
}
실행 화면
Add버튼을 13번 정도 눌러둔 상태입니다. 여기서 back키를 누르면?
다음과 같이 이전에 스택에 저장해둔 상태로 되돌아가게됩니다.
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - 액션바 숨기기 및 보이기 (0) | 2015.09.20 |
---|---|
안드로이드 - 액션바 기초 (0) | 2015.09.20 |
안드로이드 - 이클립스에서 안드로이드 SDK MANAGER가 안보일때 (0) | 2015.09.19 |
안드로이드 - ListFragment 만들기 (0) | 2015.09.13 |
안드로이드 - 프래그먼트 인수 전달 (0) | 2015.09.12 |
안드로이드 - FragmentManager를 이용한 프래그먼트 추가, 삭제, 교체, 숨김 (0) | 2015.09.12 |
안드로이드 - 프래그먼트 상태 저장하기 (0) | 2015.09.08 |
안드로이드 - 한 화면에 여러 개의 프래그먼트 만들기 (0) | 2015.09.08 |