Android/공부
[안드로이드] Fragment 프래그먼트
꾸끄꾸꾸
2020. 6. 23. 19:21
프래그먼트는 Activity 내에 생성되는, UI 구성을 여러 개의 모듈 단위로 작성할 수 있도록 해주는 기능이다. 또한 한번 작성된 프래그먼트는 여러 액티비티에서 재사용이 가능하므로 UI 구성에 소요되는 작업량을 많은 부분 감소시킬 수 있다.
액티비티처럼 하나의 독립된 모듈처럼 실행되기 때문에 액티비티와 연관된 생명주기를 가지고 있으며, 액티비티 실행 중에도 화면에 동적으로 추가되거나 다른 프래그먼트로 교체가 가능하다. 프래그먼트에는 인텐트를 사용할 수 없다.
1. xml
1. activity_main.xml
-
레이아웃에 두개의 프래그먼트(Fragment)를 추가해준다.
<fragment
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/fragment_color_list"
android:name="com.example.myfragmentex.ColorListFragment"/>
<fragment
android:id="@+id/fragment_color"
android:name="com.example.myfragmentex.ColorFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
-
각 프래그먼트는 ColorFragment와 ColorListFragment에 연결시켜준다.
-
프래그먼트는 자바 클래스로 생성
2. java
▼ ColorFragment와 ColorListFragment의 서브클래스를 사진과 같이 설정한다.
1. ColorListFragment.class
package com.example.myfragmentex;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.ListFragment;
import java.util.Arrays;
import java.util.List;
public class ColorListFragment extends ListFragment {
private onColorSelectedListener mListener;
public interface onColorSelectedListener {
void onColorSelectedListener(int color);
}
// 액티비티와 프래그먼트를 붙여주는 메소드
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
mListener = (onColorSelectedListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(((Activity) context).getLocalClassName()+
"는 OnColorSeletedListener를 구현해야 합니다.");
}
}
@Override
public void onListItemClick(@NonNull ListView l, @NonNull View v, int position, long id) {
//프래그먼트에 있는 어뎁터를 가져온다.
ArrayAdapter<String> adapter = (ArrayAdapter<String>) l.getAdapter();
String colorString = adapter.getItem(position);
int color = Color.RED;
switch (colorString) {
case "Red":
color = Color.RED;
break;
case "Blue":
color = Color.BLUE;
break;
case "Green":
color = Color.GREEN;
break;
}
if (mListener != null)
mListener.onColorSelectedListener(color);
}
// 리스트를 클릭했을때 발생하는 이벤트를 처리하는 메소드
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
List<String> colorList = Arrays.asList("Red","Green","Blue");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, colorList);
setListAdapter(adapter);
}
}
-
ColorListFragment는 ListFragment를 상속받는다.
-
클래스에는 액티비티와 프래그먼트를 붙일 때 호출하는 함수인 onAttach()를 추가하고, 색상 리스트와 리스트를 클릭했을때 발생하는 이벤트를 처리할 메소드를 정의해준다.
2. ColorFragment.class
package com.example.myfragmentex;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class ColorFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return new View(getActivity());
}
// 색상추가
public void setColor(int color) {
getView().setBackgroundColor(color);
}
}
3. MainActivity.class
package com.example.myfragmentex;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity implements ColorListFragment.onColorSelectedListener {
private ColorFragment mColorFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mColorFragment = (ColorFragment) getSupportFragmentManager()
.findFragmentById(R.id.fragment_color);
mColorFragment.setColor(Color.RED);
}
@Override
public void onColorSelectedListener(int color) {
mColorFragment.setColor(color);
}
}
3. 결과화면