프로그래밍/안드로이드

안드로이드 - 백(Back) 버튼을 눌렀을 때 이전 프래그먼트로 복귀하기

가카리 2015. 9. 13. 16:46
반응형

 

여러 개의 액티비티로 구성된 프로그램은 실행 중인 액티비티의 목록을 스택에 저장한다.

 

프래그먼트도 액티비티와 마찬가지로 스택에 저장된다.

 

현재 상태를 스택에 저장하려면 다음 메소드를 사용한다.

 

    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키를 누르면?

 

 

다음과 같이 이전에 스택에 저장해둔 상태로 되돌아가게됩니다.