반응형

이번 소개될 예제소스는 Fragment에 관련된 것입니다.


많은 초심자들이 Fragment의 사용방법은 어느정도 학습을 통해 익혔음에도

언제. 왜. 사용하는지는 모호한가 보더군요.


기껏 열심히 학습해 놓고 잘 사용을 안하더군요.


간단하게 말해서 Fragment는 Activity 클래스의 Java 코드가 너무 복잡해질 것을

우려해서 만들어진 것으로 볼 수 있습니다.

물론 근본적인 이유가 있지만

실제 사용되는 경우는 Activity 자바파일의 복잡성

해소하기 위해서라고 보면될 겁니다.


예를 들어보죠.

여러분이 이전 예제에 소개되었던 Tab 예제(ViewPager ActionBar Tab 구현)

를 실제로 앱을 구현하느데 사용한다고 가정해보겠습니다.


Tab을 누를 때마다

보여지는 화면이 달라지도록 만들텐데요.

이전 예제에서는 샘플로 만든 예제여서 각 각의 화면(xml 레이아웃 파일)안에

AnalogClockDigitalClockCalendarView들을 각각

가지고 있도록 했습니다.


하지만

실제 개발될 앱들의 경우에는 각 Tab마다 보여질 Page View(xml 레이아웃 파일)들이

샘플예제처럼 간단히 하나의 View만 가지고 있지는 않을 겁니다.

실제로는 TextView여러개, Button, EditText, ImagView 등 많은 Widget들이

하나의 Page(Tab이 보여주는 View) 안에 존재하도록 설계할 경우가 많을 겁니다.


자.여기서 생각해보죠.

만약 첫번째 탭버튼을 누를때 보여질 xml 레이아웃 파일안에 Widget이 10개있고

두번째 탭버튼을 누를때 보여질 xml 레이아웃 파일안에 Widget이 20개있고

세번째 탭버튼을 누를때 보여질 xml 레이아웃 파일안에 Widget이 15개있다면..


각 탭을 누를 때 마다 보여질 Page안에 있는 Widget들을 제어하려면

Activity 자바파일안에 Widget별로 참조변수를 만들어야 할겁니다.

실제로 Tab별로 보여질 Page는 동시에 화면에 표시될 일이 없겠죠.

하지만 Activity 자바파일안에는 참조변수를 총 45개 만들어야 합니다.

이거 너무 짜증나지 않을까요?


이럴 경우

MainActivity에서는 3개의 Page만 관리하고

각 Page마다 별도로 자기가 보여줄 View들에 대한 관리를 해주면 좋지 않을까요.


ViewGroup은 View를 여러개 추가하고 관리하지만

별도의 Java코드 파일을 생성해서 사용하지는 않죠.


그렇다고 View를 보여주기 위해 3개의 Activity를 만들어서

MainActivity에 추가하는 작업도 불가능합니다.

안드로이드는 한 화면에 Activity가 하나밖에 존재할 수 없기 때문이죠.


그래서 Activity 클래스처럼 자신이 보여줄 View를 설정하고 제어할 수 있으며

일반 View처럼 Activity의 위에 놓여질 수 있는 개념이 생겨났죠.

이것이 Fragment입니다.

쉽게말해 Activity+View 의 특징을 가지고 있다고 보면 됩니다.


시간이 되면 강좌게시판을 통해 자세한 개념을 설명하고자 합니다.

여기서는 예제소스를 보는 게시판이니 만큼 단순히

Activity 자바파일에 모든 Widget들의 참조변수를 작성하지 않아도 된다는데 그 의미를 두시기 바랍니다.


너무 설명이 서론이 길었네요. 우선 Fragment의 개념 이해를 위해

MainActivity가 보여줄 activity_main.xml파일안에 일반 View처럼 Fragment를 추가하는

예제를 소개하도록 하겠습니다.


쉽게 결과를 이해하기 위해

MainActivity가 보여주는 activity_main.xml안에는

TextView 1개

Fragment 1개만 배치해보겠습니다.

Fragment가 보여주고 관리하는 View는 Activity와 구분하기 위해

배경을 노란색(#ffff00)으로 하고 TextView는 빨간색(#ff0000) 글씨로 나타나게 하겠습니다.


먼저 결과 화면은 매우 심플합니다.


 

색이 달라서 쉽게 이해할 수 있으리라 생각됩니다.


자. 그럼 이제 위처럼 TextView 한개와 Fragment 한깨짜리 예제를 만들어보겠습니다.


먼저 Fragment가 보여줄 xml 레이아웃 파일부터 만들어보겠습니다.


  



 

 fragment_text.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:background="#ffff00" >

    

    <TextView android:id="@+id/text_fragment"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="The TextView into the TestFragment"

        android:textColor="#ff0000"/>    


</LinearLayout>

배경(backgroud)가 노란색이고 빨간색 글씨의 TextView 하나를 가지고 있는 레이아웃 파일입니다.


이제

이 레이아웃 파일을 View로 만들어 보여줄 Fragment 자바파일을 만들어보겠습니다.

자바 파일인 만큼 src폴더의 package에서 new메뉴를 실행시켜서

TestFragment라는 이름의 새로운 class 자바 파일을 아래와 같이 생성하겠습니다.


당연히 Class를 만들때 Fragment를 상속받아 만드시면 됩니다.

android.app 패키지의 Fragment를 상속받으면 됩니다.

android.support.v4의 Fragment 는 FragmentPagerAdapter를 쓸 때 사용합니다. -추후 소개될 예정-

 



만들어진 TestFragment 자바안에 Activity 자바파일처럼

lifecycle 콜백 메소드 중 보여줄 View를 만들어내는 onCreateView메소드를 오버라이드(Override)해서

위에 만든 fragment_test.xml파일을 설정해 보겠습니다.

 

 TestFragment.java

public class TestFragment extends Fragment {

public TestFragment() {

// TODO Auto-generated constructor stub

}

//Fragment의 lifecycle 메소드 중에서 Fragment가 보여줄 View를 설정하는 메소드

//MainActivity.java 에서 onCreate() 메소드 안에 setContentView()하듯이

//Fragment에서는 이 메소드에서 Fragment가 보여줄 View 객체를 생성해서 return 시켜줘야 함.

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

// TODO Auto-generated method stub

View view=null; //Fragment가 보여줄 View 객체를 참조할 참조변수

//매개변수로 전달된 LayoutInflater객체를 통해 fragment_test.xml 레이아웃 파일을

//View 객체로 생성

view= inflater.inflate(R.layout.fragment_test, null);

//생성된 View 객체를 리턴

return view;

}


}

코드에 대한 설명은 주석을 참고하시기 바랍니다.


 이제

Fragment를 다 설계했으니

MainActivity에 보여지도록 activity_main.xml안에 태그문을 통해 포함시켜 보겠습니다.

TextView 1개와 Fragment 1개를 작성합니다.


 

 activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical">

    

    <TextView android:id="@+id/text"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="The TextView into the MainActivity"/>

    

    <!-- TestFragment를 MainActivity가 보여줄 View로 고정시켜서 배치 -->

    <!-- 직접적으로 XML 레이아웃 파일에 태그문으로 생성된 Fragment는  동적으로 재배치/삭제 불가-->

    <fragment android:name="com.kitesoft.fragment.TestFragment"

        android:id="@+id/frag"

        android:layout_width="match_parent"

        android:layout_height="match_parent"/>    


</LinearLayout>

 

fragment 태그 문의 주요 속성인 name을 통해 어떤 Fragment 클래스인지 구분합니다.


그래픽 모드로 옮겨서 미리보기를 보면 아래처럼 보여질 겁니다.


 

MainActivity.java 파일은 activity_main.xml 보여주는 기본 코드

그대로 입니다.

하나도 바뀌지 않았습니다.

 

 MainActivity.java

public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}


이제 실행 시켜주면

MainActivity에서 보여주는 View에 Fragment가 포함되어서 보여질 겁니다.


다음 포스트에서는

이렇게 만들어진 Fragment의 TextView를 MainActivity에서 제어해 보겠습니다.


반응형

+ Recent posts