[ Fragment 기초 예제 2 ]                                    0. 참고 : DO IT 안드로이드 (02-10 : SampleFragment)

 

1. 소스 이동 설명

   - activity_main.xml  -> fragment_main.xml <-> fragment_menu.xml

     실제 이동 방법은

        activity_main.xml  Layout에서  onFragmentChanged()  메소드를 이용해서 2개의 fragment를 교체(replace)해준다.

                  -> fragment_main.xml 

                  -> fragment_menu.xml

   - activity_main.xml 내부에 <fragment> 안에  fragment_main Layout을 넣는다.

   - fragment_main Layout에서 버튼을 클릭 하면 fragment_menu Layout을 open한다.

   - fragment_menu Layout 에서 [메인 화면 으로] 버튼 클릭 시    fragment_main Layout으로 간다.

   -

        <-> 

 

 

 

2. FragmentManage객체

   - 프래그먼트 매니저는 프래그먼트를 다루는 작업을 해주는 객체로써 프래그먼트를 추가,삭제 또는 교체등의 작업을 할 수 있게 해줌.

   - 그런데 이런 작업들은 프래그먼트를 변경할 때 오류가 생기면 다시 원래 상태로 돌릴 수 있어야 하므로 트랜젝션 객체를 만들어 실행한다.

   - 트랜젝션 객체는 beginTransaction()메소드를 호출하면 시작되고 commit()메소드를 호출하면 실행된다.

 

3. getFragmentManager(), getSupportFragmentManager() 의 동일점, 차이점

   - 동일점 : 동일한 기능을 수행하는 FragmentManager객체를 리턴

   - 차이점 : getSupportFragmentManager()메소드는 안드로이드 이전 버전들에서도 프래그먼트를 사용할 수 있도록 만든

                appcompat_v7라이브러리 프로젝트에서 지원하는 기능이므로 프로젝트를 만들 때 getSupportFragmentManager()메소드

                사용을 권장 한다.

                이는 MainActivity객체가 상속하는 AppCompatActivity클래스도 마찬가지여서 android.support.v7.app패키지 안에 있는

                AppCompatActivity클래스를 사용해야 한다.

 

 

 

1. activity_main.xml

   - <fragment> 가 필요 : 첫 activity_main Layout을 띄우면서 바로  fragment_main Layout을 이 <fragment>에 넣는다.

   - android:name="org.androidtown.fragment.MainFragment" :

   -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container"
    >

    <fragment
        android:id="@+id/mainFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="org.androidtown.fragment.MainFragment" />

</RelativeLayout>

 

2. MainActivity.java

   1. getSupportFragmentManager().findFragmentById()

      - Fragment는 뷰가 아니라서 Activity클래스에 있는 findViewById()메소드를 이용해서 찾을 수 없다.

         대신 프래그먼트르르 관리하는 FragmentManager객체의 findFragmentById()메소드를 이용해 찾을 수 있다.

      - 메인 프래그먼트는 findFragmentById() 메소드를 이용해 찾은 후 변수에 할당하고,

        메뉴 프래그먼트는 new연산자를 이용해 새로운 객체로 만든 후 변수에 할당한다.

   2. onFragmentChanged()
      - MainFragment.java에서 호출
      - activity_main Layout에서  2개의 Fragment를 교체 해준다.

   3. getSupportFragmentManager()

      - 메인 액티비티에 새로 추가할 메소드로 프래그먼트 매니저를 이용해 프래그먼트를 전환하는 메소드이다.

        이렇게 코드를 입력한 이유는 프래그먼트가 액티비티를 본더 만들었고 액티비티 관리를 시스템에서 하는 것처럼

        프래그먼트 관리를 액티비티가 하기 때문이며, 액티비티에서 프래그먼트를 전환하도록 만들어야 하기 때문이다.

public class MainActivity extends AppCompatActivity {
    MainFragment mainFragment;
    MenuFragment menuFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.mainFragment);
        menuFragment = new MenuFragment();
    }

    public void onFragmentChanged(int index) {
        if (index == 0) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, menuFragment).commit();
        } else if (index == 1) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, mainFragment).commit();
        }
    }
}

 

3. MainFragment.java

   -

public class MainFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main, container, false);

        Button button = (Button) rootView.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity activity = (MainActivity) getActivity();
                activity.onFragmentChanged(0);
            }
        });

        return rootView;
    }
}

 

4. MenuFragment.java

   -

public class MenuFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_menu, container, false);

        Button button = (Button)rootView.findViewById(R.id.button);
        button.setOnClickListener(buttonListener);

        return rootView;
    }

    View.OnClickListener buttonListener = new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            Toast.makeText(getContext(), "메인 화면으로 가기 버튼 클릭", Toast.LENGTH_SHORT).show();
            //종료 안됨.
            //  --아래 2줄은 Fragment를 change해주는 소스임
            //  --MainActivity에 Fragment를 여러장 올려 놓고 서로 교체하는 소스임.
            //  --예url : http://blog.naver.com/ssy9137/220725822294
            //MainActivity activity = (MainActivity)getActivity();
            //activity.onFragmentChanged(-1);

            //getActivity().getFragmentManager().beginTransaction().remove(this).commit();  //this 오류 발생
            //getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();  //this 오류 발생
            //getActivity().getSupportFragmentManager().popBackStack();  //종료 안됨
            //getActivity().getFragmentManager().popBackStack();  //종료 안됨
            //getFragmentManager().popBackStack(); //종료 안됨
            //getActivity().onBackPressed();  //아에 앱이 종료 됨. 즉 Main Activity 로 돌아가지 않음.
            //getActivity().finish();  //아에 앱이 종료 됨. 즉 Main Activity 로 돌아가지 않음.

            //종료 안됨.
            //FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            //transaction.addToBackStack(null);

            //종료 잘 됨.
            //  아래 방식은 fragment를 종료하는 방법임
            //FragmentManager manager = getActivity().getSupportFragmentManager();
            //manager.beginTransaction().remove(MenuFragment.this).commit();
            //manager.popBackStack();

            //MainActivity.java 의 replace문법으로 fragment를 교체해 준다.
            MainActivity activity = (MainActivity) getActivity();
            activity.onFragmentChanged(1);
        }
    };
}

 

5. fragment_main.xml

   -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메인 프래그먼트"
        android:id="@+id/textView"
        android:textSize="30dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메뉴 화면으로"
        android:id="@+id/button" />
</LinearLayout>

 

6. framgnet_menu.xml

   -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffc07c">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메뉴 프래그먼트"
        android:id="@+id/textView"
        android:textSize="30dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메인 화면으로"
        android:id="@+id/button" />
</LinearLayout>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'[Android] - 개념 > Fragment' 카테고리의 다른 글

Fragment 기초 예제 3  (0) 2016.12.04
Fragment 기초 예제 1  (0) 2016.11.30
Fragment 기본 개념  (0) 2016.11.29
Posted by 농부지기
,