Programming/Android

[안드로이드] 프래그먼트 구현하기 (Implementation Fragment)

devssun 2017. 3. 6. 19:34
728x90
반응형



오랜만에!! 졸작 준비를 위해 놓았던 안드로이드를 다시 하는 중..

남들 다 한다는 리사이클러뷰와 프래그먼트를 이제서야 공부중이다





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




- MainActivity.java

액티비티 자바파일에서 우리가 만든 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판, 이지스퍼블리싱)

반응형