룬아님의 취중코딩

2-3. 안드로이드 개발 레벨업 교과서 (Fragment) 본문

카테고리 없음

2-3. 안드로이드 개발 레벨업 교과서 (Fragment)

룬아님 2019. 8. 18. 23:12

https://github.com/wikibook/advanced-android-book/tree/master/tech02/SimpleFragmentSample

 

wikibook/advanced-android-book

『안드로이드 개발 레벨업 교과서: 현업 최고의 안드로이드 개발자가 알려 주는』 예제 코드. Contribute to wikibook/advanced-android-book development by creating an account on GitHub.

github.com

 


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

 

Activity 와 Fragment 의 lifecycle (생명주기)

안드로이드는 에서 Activity와 Fragment의 lifecycle(생명주기)에 맞추어 개발을 하는 것이 매우 중요한데요. 오늘은 Activity와 Fragment의 생명주기에 관해서 정리해보겠습니다. 1. Activity 생명주기 먼저, Act..

developer88.tistory.com

* 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

 

wikibook/advanced-android-book

『안드로이드 개발 레벨업 교과서: 현업 최고의 안드로이드 개발자가 알려 주는』 예제 코드. Contribute to wikibook/advanced-android-book development by creating an account on GitHub.

github.com

 

반응형
Comments