일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 고차함수
- 안드로이드스튜디오
- 안드로이드개발레벨업교과서
- 테마 아이콘
- 리사이클러뷰
- ActivityTestRule
- 구분선
- 재사용
- 안드로이드
- 생명주기
- viewholder
- IntentTestRule
- Fragment에서 Activity의 함수 사용하기
- binding adapter
- LayoutManger
- espresso
- 코딜리티
- Error:Execution failed for task ':app:mergeDebugResources'
- 스와이프
- searchview
- 코틀린
- high order function
- recyclerview
- 안드로이드13
- ui test
- fragment
- Android
- adapter
- 뷰변경 감지
- Fragment 수동 추가
- Today
- Total
룬아님의 취중코딩
2-3. 안드로이드 개발 레벨업 교과서 (Fragment) 본문
https://github.com/wikibook/advanced-android-book/tree/master/tech02/SimpleFragmentSample
Fragment에서 Activity의 함수 사용하기
액티비티와 연계하기 위한 리스너 (MyFragment.java)
public class MyFragment extends Fragment {
...
/**
* 액티비티와 연계하기 위한 인터페이스
*/
public interface OnFragmentInteractionListener {
void onFragmentInteraction();
}
}
액티비티 쪽에서 리스너를 구현 (MainActivity.java)
public class MainActivity extends AppCompatActivity implements MyFragment.OnFragmentInteractionListener {
...
@Override
public void onFragmentInteraction() {
Toast.makeText(getApplicationContext(), "버튼이 눌렸습니다", Toast.LENGTH_SHORT).show();
}
}
onAttach 안에서 필드에 저장한다. (MyFragment.java)
@Override
public void onAttach(Context context) {
super.onAttach(context);
// Activity 쪽에 필요한 인터페이스가 구현됐는지 확인
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " OnFragmentInteractionListener를 구현해 주세요");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
* MainActivity에 대한 참조를 직접 가지지 않고 ((MainActivity)getActivity와 같은) 인터페이스로서 가지는 것은 특정 액티비티에 의존하지 않도록 결합을 느슨하게 만들기 위함.
액티비티로부터 작성한 프래그먼트를 이용한다. (activity_main.xml)
<fragment
android:id="@+id/myfragment"
android:name="com.advanced_android.simplefragmentsample.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
* name속성에 Fragment 클래스 이름을 기술하여 activity_main.xml로 뷰를 생성할 때 프래그먼트도 같이 생성한다.
전체 코드
public class MyFragment extends Fragment {
private OnFragmentInteractionListener mListener;
// 빈 생성자는 Fragment 이용에 필요
public MyFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_my, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onFragmentInteraction();
}
}
});
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
// Activity 쪽에 필요한 인터페이스가 구현됐는지 확인
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " OnFragmentInteractionListener를 구현해 주세요");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* 액티비티와 연계하기 위한 인터페이스
*/
public interface OnFragmentInteractionListener {
void onFragmentInteraction();
}
}
Fragment 수명주기
https://developer88.tistory.com/69
* fragment의 생명주기 매우 복잡하고 내용이 많기 때문에 정리가 잘되어 있는 블로그를 링크합니다.
메서드명 | 시점 | 실행하는 처리의 예 |
onAttach | 프래그먼트와 액티비티가 연결될 때 | 이 시점에서 getActivity 메서드는 null을 반환한다. |
onCreate | 생성 시 | 초기화 처리 |
onCreateView | 생성 시 | 뷰 생성 |
onActivityCreated | 생성 시 | 초기화 처리, 뷰 생성(setContentView의 호출) 등 |
onStart | 비표시 상태 | 표시 전 시점 |
onResume | 표시 시 | 필요한 애니메이션 등 실행 화면 갱신 처리 |
onPause | 일부 표시(일시정지) 상태 | |
onStop | 비표시 상태 | |
onDestroyView | 폐기 시 | 필요 없는 리소스 해제 |
onDestroy | 폐기 시 | 필요 없는 리소스 해제 |
onDetach | 폐기 시 | 필요 없는 리소스 해제 |
* 액티비티의 onSaveInstanceState()는 프래그먼트에도 있다. 이 메서드는 프래그먼트가 폐기되기 전에 호출되므로 필요한 정보는 이때 저장할 수 있다. 액티비티와는 달리 onRestoreInstanceState()는 프래그먼트에는 존재하지 않지만 onCreate() ~ onActivityCreated()의 생명주기의 메서드의 인수에는 Bundle이 포함돼 있다. 이런 특징을 이용해 엑티비티의 onRestoreInstanceState()와 똑같이 복귀하도록 구현할 수 있다.
중첩 Fragment
https://github.com/wikibook/advanced-android-book/tree/master/tech02/NestedFragmentSample
프래그먼트 추가 및 삭제
findViewById(R.id.add_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction() //트랜잭션 생성
.add(R.id.fragment_container, MyFragment.getInstance(mNumber))
.addToBackStack(null)//백스택에 추가
.commit();
}
});
findViewById(R.id.remove_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mNumber == 0) {
return;
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack();//백스택에서 꺼내서 직전 상태로 돌아간다.
}
});
UI가 없는 프래그먼트
UI를 갖지 않는 프래그먼트를 헤드리스 프래그먼트라고 부른다. 기본 액티비티 클래스로서 BaseActivity를 만들고, 거기에 액티비티의 공통된 처리를 구현하는 경우가 있다. 그러한 공통 처리에서 UI와 연결되지 않은 부분을 헤드리스 프래그먼트로서 구현할 수 있다. 아래의 예제에서는 네트워크 연결 확인 및 네트워크 연결 변경 감지를 프래그먼트로 구현하였다.
https://github.com/wikibook/advanced-android-book/tree/master/tech02/NetworkCheckFragmentSample