프래그먼트(Fragment)란?

이세인·2021년 7월 8일
0

do_it_안드로이드

목록 보기
3/3
post-thumbnail

앱에서는 한 화면에 여러 부분 화면을 넣는 경우가 많다. ( 레이아웃 안에 레이아웃 안에 레이아웃안에... )

이때의 부분 화면을 레이아웃을 넣어서 만드는 것이 아닌 프래그먼트(Fragement) 를 넣어서 만들수 있다!

  • 어떤 차이?
    fragment로 만들면, 한번 만들고 나서 재사용이 가능하다.

  • fragment는 activity를 본떠서 만들었다. (재사용 하기 위해)
    --> fragment는 activity의 특성과 layout의 특성을 둘 다 가지고 있다고 볼 수 있다.

  • 만약 한 fragment가 activity 전체를 덮게 만들면 (activity는 바뀌지 않고) 화면 전환하는 것 같은 효과를 준다.

  • fragment는 activity 위에 올려야 동작한다. 이는 xml 또는 자바코드에서 설정 가능하다.

  • fragment에는 setContextView() 메서드가 없기 때문에, LayoutInflater을 사용해 인플레이션을 해야한다. 이는 onCreateView() 메서드에서 사용할 수 있다.

이제 fragement를 올리는 방법 2가지를 알아보자

1. xml 파일에 직접 추가하는 방법

  1. MainFragment를 만든다.

  2. fragment 자바 코드를 작성한다.
    다음은 MainFragment.java 소스코드이다.

public class MainFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_main, container, false);
        // fragment_main.xml 파일을 메모리에 올려서 소스코드와 레이아웃을 연결하는 역할
    }
}

위에서 말했듯이, Fragment에는 setContextView() 메서드가 없기 때문에 inflater를 이용한다. fragment_main.xml을 container에 올린다는 것이고 false는 지금 당장올리지 않는다는 뜻이다.

  1. 그리고 activity_main.xml에 직접 fragment 태그를 추가한다.
    다음은 activity_main.xml이다.
    fragment 태그를 추가한 것을 볼 수 있다.


2. 자바 소스코드에 추가하는 방법

  1. MenuFragment를 만든다. app에 바로 추가하지 않고, xml파일과 java파일을 만든다.

  2. 위와 같이 fragment 자바 코드를 작성한다.
    다음은 MenuFragment.java 소스코드이다.

public class MenuFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_menu, container, false);
    } //fragment_menu.xml 파일을 메모리에 올려서 소스코드와 레이아웃을 연결하는 역할
}

  1. main에서 버튼을 누르면 menu를 불러오도록 MainFragment 소스코드를 수정한다.
public class MainFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main, container, false);
        // 프래그먼트에서 버튼 찾는거 같은거 하려면 ViewGroup 이용해야한다. 바로 못함!

        Button button = rootView.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //fragment 바꾸는 거는 activity에서 해야한다.
                MainActivity activity = (MainActivity) getActivity();
                activity.onFragmentChanged(1);
            }
        });

        return rootView;
    }
}

  1. onFragmentChanged() 함수를 mainactivity에 작성한다.
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, mainFragment).commit();
        } else if(index == 1){
            getSupportFragmentManager().beginTransaction().replace(R.id.container, menuFragment).commit();
        }
    }
}
profile
Hongik CE

0개의 댓글