오랜만에!! 졸작 준비를 위해 놓았던 안드로이드를 다시 하는 중..
남들 다 한다는 리사이클러뷰와 프래그먼트를 이제서야 공부중이다
1. 프래그먼트란 무엇일까?
예전에는 Activity가 대부분 사용되었다. 근데 이제 한 화면에서도 많은 작업을 필요로 하는 기능들이 필요하게 되었는데
이때 화면을 여러 부분으로 분할하여 한꺼번에 보여주거나 각각의 부분 화면 단위로 바꿔서 보여주고 싶을 때 사용한다
간단히 하면
프래그먼트는 분할된 화면들을 독립적으로 구성하고 그 상태를 관리하는 데에 있다.
캔디카메라 화면
- 한 화면에 각각의 기능을 하는 뷰가 있다.
액티비티로만 설계된 화면은 intent를 사용해 값을 전달하고 전달받고
화면간의 이동이 이루어지기 때문에 약간의 시간도 소모된다
하지만 프래그먼트는 한 화면에서 메소드 호출을 통해 데이터를 전달받을 수 있고
액티비티를 전환하지않고도 화면 전환의 효과를 낼 수 있다
최근 만들어지는 App은 대부분 프래그먼트를 사용한다고 보면 된다. (물론 액티비티도 쓴다!)
그럼 주요 사용하는 메소드에 대해 알아보자
2. Fragment, FragmentManager 클래스 주요 메소드
* Fragment
public final Activity getActivity() - 이 프래그먼트를 포함하는 액티비티를 리턴함
public final FragmentManager getFragmentManager() - 이 프래그먼트를 포함하는 액티비티에서
프래그먼트 객체들과 의사소통하는 프래그먼트 매니저를 리턴함
public final Fragment getParentFragment() - 이 프래그먼트를 포함하는 부모가 프래그먼트일 경우 리턴함, 액티비티이면 null 리턴
public final int getId() - 이 프래그먼트의 ID를 리턴함
* FragmentManager
public abstract FragmentTransaction beginTransaction() - 프래그먼트를 변경하기 위한 트랜잭션을 시작함
public abstract Fragment findFragmentById(int id) - ID를 이용해 프래그먼트 객체를 찾음
public abstract Fragment findFragmentByTag (String tag) - Tag 정보를 이용해 프래그먼트 객체를 찾음
public abstract boolean executePendingTransactions() - 트랜잭션은 commit() 메소드를 호출하면 실행되지만
비동기방식으로 실행되므로 즉시 실행하고 싶다면 이 메소드를 추가로 호출해야 함
참고 : https://developer.android.com/reference/packages.html
레퍼런스 사이트는 개발할 때, 공부할 때 참고해야 할 사이트이다!!!
모든 메소드와 클래스에 대한 정보가 있기때문에 큰 도움이 될 것이다.
3. 그럼 직접 구현해보자
가장 기본적인 형태로 하나의 Activity에 하나의 Fragment가 연결되어있다
- fragment_main.xml
레이아웃 설계하기, 버튼하나만을 추가하도록 한다
이 레이아웃은 MainFragment.java에서 인플레이션할것이다
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:text="TEST button" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> | cs |
- MainFragment.java
inflater에 대해 잠깐 알아보겠습니다!
inflate란 '부풀리다'라는 의미로써 실제 Android에서 xml파일에 정의되어 있는 view에 대한 정의를 바탕으로
코드상에서 view객체를 생성하는 것입니다
inflate() 첫번째 파라미터 - xml 레이아웃 파일
두번째 파라미터(ViewGroup) - xml 레이아웃이 설정될 뷰그룹 객체
inflate() 메소드를 호출하여 반환된 ViewGroup 객체 또한 이 프래그먼트의 가장 상위 레이아웃인데 인플레이션된 상태로
반환되므로 이 객체(rootView)를 리턴해줍니다
1 2 3 4 5 6 7 8 9 10 | public class MainFragment extends android.support.v4.app.Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.fragment_main, container, false); Log.e("Frag", "MainFragment"); return rootView; } } | cs |
- activity_main.xml
프래그먼트를 메인 액티비티에 추가하는 방법 (fragment 태그 사용)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <fragment android:id="@+id/main_fragment" android:name="com.dev.mmm.mhh.MainFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> | cs |
액티비티 자바파일에서 우리가 만든 Fragment의 객체를 생성하여줍니다
기존에 하던 Activity에서 findViewById() 메소드를 사용할 수 없는 이유는 프래그먼트는 View가 아니기때문입니다
그래서 findFragmentById() 메소드를 통해 생성된 fragment를 찾은 후 변수에 할당합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class MainActivity extends AppCompatActivity { MainFragment mainFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.main_fragment); Log.e("Frag", "Fragment"); } } | cs |
참고자료 : Do it! 안드로이드 앱 프로그래밍(마시멜로 반영판, 전면개정 3판, 이지스퍼블리싱)
'Programming > Android' 카테고리의 다른 글
[안드로이드] Fragment에서 RecyclerView 사용하기 (4) | 2017.03.08 |
---|---|
[안드로이드] RecyclerView에 대해 간단히 알아보기 (0) | 2017.03.07 |
[안드로이드] excution failed for task app clean 해결법 (0) | 2016.09.23 |
[안드로이드] Android Studio(안드로이드스튜디오)에서 github 원격저장소 연결하기 (0) | 2016.09.13 |
[안드로이드] Android ListView Auto Scroll/안드로이드 리스트뷰 자동 스크롤(자동 하단) (0) | 2016.07.24 |