티스토리 뷰

Android

프래그먼트 예시

varyeun 2020. 4. 22. 18:57

프래그먼트는 언제 쓰는지?

 

: 보통 액티비티로 만든 화면 안에 부분화면을 만들고 싶으면 레이아웃안에 레이아웃을 넣으면 되는데, 다른 액티비티에서도 그 레이아웃을 사용하고 싶다면 XML 레이아웃에 들어있는 태그와 소스파일의 코드를 그대로 복사하여 다른 액티비티를 위한 파일에 붙여넣기하는 과정을 거쳐야한다.

 

이런 경우 부분화면을 독립적으로 사용할 수 있는 방법 = 프래그먼트

 

인플레이션을 하거나, 소스 코드 내에서 프래그먼트 매니저를 통해 프래그먼트를 사용할 수 있는데

나한텐 프래그먼트 매니저를 쓰는게 더 편한 것 같다. 예시에서 xml 주석처리한 부분이 인플레이션 하는 방법임

- 프레그먼트는 메소드로 소통(?)함

 

activity_main.xml

<?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">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="메인" />

    <FrameLayout
         android:id="@+id/container"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_below="@+id/button">
         <!--
         <fragment
             android:id="@+id/mainFragment"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:name="com.example.myfragment.MainFragment"/>
          -->

    </FrameLayout>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="103dp"
        android:layout_marginLeft="103dp"
        android:text="메뉴" />

</RelativeLayout>

MainFragment.java

package com.example.myfragment;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class MainFragment extends Fragment {
    MainActivity activity;
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        activity = (MainActivity) getActivity();
    }

    @Override
    public void onDetach() {
        super.onDetach();

        activity = null;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull 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) {
                activity.onFragmentChange(1);
            }
        });
        return rootView;
    }
}

MainActivity.java

package com.example.myfragment;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    MainFragment fragment1;
    MenuFragment fragment2;

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

        fragment1 = new MainFragment();
        fragment2 = new MenuFragment();

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment1).commit();

            }
        });
        Button button2 = (Button)findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment2).commit();

            }
        });
    }

    public void onFragmentChange(int index){
        if(index==0){
            getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment1).commit();
        }
        else if(index==1){
            getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment2).commit();
        }
    }
}
댓글