Official site
Fragment _ https://developer.android.com/reference/android/app/Fragment
Test your Fragment _ https://developer.android.com/training/basics/fragments/testing
Build a flexible UI _ https://developer.android.com/training/basics/fragments/fragment-ui
Communicate with other fragments _ https://developer.android.com/training/basics/fragments/communicating
Fragment를 생성할 때 Tag지정을 해주는게 좋을거같다. 테스크저장 및 ActivityResult 등등을 위하여
프래그먼트 생성시 주의할점
Fragment 엘리먼트 생성 후 FragmentManager를 통하여 add 시킬 시 엘리먼트 중복현상으로 onCreateView가 두 번 호출되는 문제가 발생했다.
<fragment
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/fragment"
android:name="com.example.kotlin.ui.main.MainFragment"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
xml에 Fragment 엘리먼트 생성 후
private fun setFragment() {
val fm: FragmentManager = supportFragmentManager
val ft: FragmentTransaction = fm.beginTransaction().apply {
add(R.id.fragment, MainFragment())
commit()
}
}
add를 시키면?
-> Fragment 엘리먼트가 두 번 생성되어 onCreateView가 두 번 호출됨.
private fun setFragment() {
val fm: FragmentManager = supportFragmentManager
val ft: FragmentTransaction = fm.beginTransaction().apply {
replace(R.id.fragment, MainFragment())
}
}
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent" android:layout_height="match_parent" />
replace로 대체하거나 fragment엘리먼트대신 FrameLayout 엘리먼트를 생성한다.
프래그먼트에서의 onActivityResult
참조 사이트 _ https://www.dante2k.com/462
fragment)
getActivity().startActivityForResult(Intent.createChooser(intent, "Select Picture"), REQUEST_GET_SIGNLE_FILE);
activity)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.view_pager + ":" + mViewPager.getCurrentItem());
if(fragment != null) {
fragment.onActivityResult(requestCode, resultCode, data);
} else {
Log.d("TEST", "ERROR FRAGMENT IS NULL");
}
}
나는 좀 더 심한 상황이었다.
Fragment는 v4 그리고 ViewPager를 사용중이며 FragmentPagerAdapter를 사용중이었다.
해결책 )
activity)
Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.view_pager + ":" + mViewPager.getCurrentItem());
if(fragment != null) {
fragment.onActivityResult(requestCode, resultCode, data);
} else {
Log.d("TEST", "ERROR FRAGMENT IS NULL");
}
마지막 Fragment에서 콜백받는다.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_GET_SIGNLE_FILE) {
if(resultCode == Activity.RESULT_OK) {
Log.d("TEST", "Yeah");
}
}
}