Things take time

[Android] Fragment Activity, 프래그먼트 액티비티란 본문

Android(기능)

[Android] Fragment Activity, 프래그먼트 액티비티란

겸손할 겸 2019. 7. 5. 15:23

[액티비티]

 

흔히 액티비티는 하나의 화면을 의미한다. 그래서 하나의 액티비티 클래스는 하나의 XML로 된 레이아웃 파일과 연결된다.

그런데 프래그먼트 액티비티란 개념이 나왔는데, 이 액티비티는 간단히 말해서 하나의 액티비티안에 여러 개의 액티비티를 보여주고 싶다는 목적으로 사용한다. (실제로 액티비티를 여러개 넣는 것이 아니고 그렇게 보이도록 하는 것)

 

그러므로 로직은 하나의 액티비티가 존재하고, 그 액티비티 안에 다른 액티비티들을 넣고 싶다면 다른 액티비티들(넣는, 들어가는 액티비티)은 Fragment를 상속받는 액티비티여야 한다.

 


[액티비티 -> 프래그먼트 액티비티 변경]

 

프래그먼트 액티비티로 새로만들면 되지만, 기존 액티비티를 프래그먼트로 쓰고 싶을때 사용한다는 의미이다.

아래의 기본 액티비티 클래스를 만들었다(레이아웃 XML과 함께)

public class PartnersListActivity extends AppCompatActivity {

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

이걸 프래그먼트로 상속받도록 변경하면

 

- 참고

Fragment는 Activity의 한 종류에 속하는 개념이다. 또한, FragmentActivity라는 클래스를 상속받는 것과 헛갈릴 수 있지만, FragmentActivity를 상속받는 것은 옛날 안드로이드 3.0이전의 Fragment를 지원하기위해 상속받는 클래스이므로, 간단히 Fragment를 사용해야하며 이게 프래그먼트 액티비티란 것이다.

- 자료 : https://stackoverflow.com/questions/10609268/what-is-the-difference-between-fragment-and-fragmentactivity

public class PartnersListActivity extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

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

        return view;
    }
}

onCreateView라는 함수를 오버라이드하게 되며, 실제 레이아웃파일 위젯과 findViewById를 통해 연결하는하는 곳이 onCreateView이다. 참고로 onCreate는 onCreateView이전에 호출된다.

 

activity_partners_list.xml

연결된 레이아웃파일은 이렇게 생겼다.

 

 

[프래그먼트를 호출하는 모체 액티비티]

 

프래그먼트 액티비티를 호출할 액티비티를 생성한다. 

public class IncludeActivity extends AppCompatActivity {

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

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.ll_fragment, new PartnersListActivity());
        transaction.commit();

    }
}

일반 액티비티를 상속받으며 activity_include라는 xml 레이아웃파일로 되어있다.

중요한 것은 그 다음부터 나오는 FragmentManger 클래스와 transaction이다.

ll_fragment라는 리니어 레이아웃 id를 찾아서 그 부분을 PartnersListActivity, 즉 프래그먼트를 상속받는 액티비티로 교체한다는 의미이다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:textSize="20dp"
        android:gravity="center_horizontal|center_vertical"
        android:textColor="@color/colorPrimary"
        android:text="여기는 include activity"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:id="@+id/ll_fragment"
        ></LinearLayout>
</LinearLayout>

activity_include.xml

 

예시 화면

위 화면처럼 모체 액티비티를 생성했다.

include activity라는 텍스트뷰 밑에는 LinearLayout이 들어가 있다. 이제 이를 실행하면

 

 

activity_include.xml 안에 있던 리니어레이아웃에 프래그먼트 액티비티를 넣은 것이다.

 

[데이터 전달하기]

모체 액티비티에서 프래그먼트 액티비티에게 데이터를 전달해야한다면, 프래그먼트 액티비티에선 하나의 메소드를 구현한다. 그리고 onCreateView에서 넘겨받은 데이터가 있는지 검사하고, 필요에 따라 UI를 변경하는 등의 작업을 수행하면 된다.

public class PartnersListActivity extends Fragment {

    public static PartnersListActivity newInstance(String param) {
        Bundle args = new Bundle();
        args.putString("key", param);

        PartnersListActivity fragment = new PartnersListActivity();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_partners_list, container, false);
        if (getArguments() != null) {
            String val = getArguments().getString("key");
            Log.e("getArguments", val);
        }
        return view;
    }
}

위처럼 프래그먼트를 상속받는 액티비티 클래스를 변경한다.

매개변수 String param은 모체 액티비티에서 프래그먼트를 연결할 때 넘겨주어야 하며, onCreateView에서 이후 처리를 수행한다.

 

그리고 예제를 위해 모체 액티비티를 아래와 같이 변경하면

public class IncludeActivity extends AppCompatActivity {

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

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.ll_fragment, PartnersListActivity.newInstance("test"));
        transaction.commit();
    }
}

test라는 변수를 전달하면 된다. 그리고 로그를 찍었을 때

 

이렇게 확인할 수 있다.

 

참고 : https://medium.com/@henen