반응형

이번 포스팅은 Fragment 생성하는 방법에 대하여 알아보도록 하겠습니다.


Fragment의 생성



Fragment를 생성하려면 Fragment 클래스를 extend 한 후 Activity 클래스에서와 마찬가지로 주요 수명 주기 메서드를 재정의하여 자체 앱 로직을 적용합니다.

Fragment 생성 시 한 가지 차이점은 레이아웃 정의에 onCreateView() 콜백을 사용해야 한다는 점입니다. 사실 Fragment 실행에 필요한 콜백은 이것뿐입니다. 다음은 자체 레이아웃을 지정하는 간단한 Fragment의 예입니다.

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.ViewGroup

class ArticleFragment : Fragment() {
   
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup,
                     savedInstanceState
: Bundle?): View {
       
// Inflate the layout for this fragment
       
return inflater.inflate(R.layout.article_view, container, false)
   
}
}

Activity와 마찬가지로, Fragment는 Activity에 추가되거나 Activity에서 삭제될 때, 그리고 Activity가 수명 주기 상태 간에 전환될 때 Fragment의 상태를 관리할 수 있는 다른 수명 주기 콜백을 구현해야 합니다. 예를 들어 Activity의 onPause() 메서드가 호출되면 Activity 내 모든 Fragment도 onPause() 호출을 받게 됩니다.

Fragment 수명 주기 및 콜백 메서드에 대한 자세한 내용은 Fragments 개발자 가이드를 참조하세요.


XML을 이용하여 Activity에 Fragment 추가



Fragment는 재사용이 가능한 모듈식 UI 구성 요소인 반면, Fragment 클래스의 각 인스턴스는 상위 FragmentActivity와 연결되어야 합니다. Activity 레이아웃 XML 파일 안에 각각의 Fragment를 정의하여 이 연결을 설정할 수 있습니다.

★ 참고: FragmentActivity는 지원 라이브러리에서 제공하는 특수한 Activity이며, API 레벨 11보다 낮은 시스템 버전에서 Fragment를 처리하는 데 사용합니다. 지원하는 가장 낮은 시스템 버전이 API 레벨 11 이상일 경우, 일반 Activity를 사용해도 됩니다.

다음은 기기 화면을 "large"로 간주할 때, 두 개의 Fragment를 Activity에 추가하는 레이아웃 파일의 예입니다. (디렉토리 이름에 large 한정자가 지정되어 있음).

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   
android:orientation="horizontal"
   
android:layout_width="fill_parent"
   
android:layout_height="fill_parent">

   
<fragment android:name="com.example.android.fragments.HeadlinesFragment"
             
android:id="@+id/headlines_fragment"
             
android:layout_weight="1"
             
android:layout_width="0dp"
             
android:layout_height="match_parent" />

   
<fragment android:name="com.example.android.fragments.ArticleFragment"
             
android:id="@+id/article_fragment"
             
android:layout_weight="2"
             
android:layout_width="0dp"
             
android:layout_height="match_parent" />

</LinearLayout>

그런 다음 레이아웃을 Activity에 적용합니다.

import android.os.Bundle
import android.support.v4.app.FragmentActivity

class MainActivity : FragmentActivity() {
   
override fun onCreate(savedInstanceState: Bundle?) {
       
super.onCreate(savedInstanceState)
        setContentView
(R.layout.news_articles)
   
}
}

위 소스에서 v7 appcompat library를 사용하는 경우, Activity는 FragmentActivity의 하위 클래스인 AppCompatActivity를 대신 확장해야 합니다. 자세한 내용은 App bar 추가를 참조하세요.

참고: 레이아웃 XML 파일에서 Fragment를 정의하여 Activity 레이아웃에 Fragment를 추가하는 경우, 런타임에 Fragment를 삭제할 수 없습니다. 사용자 상호작용 중 Fragment를 추가 및 삭제하려면, Activity를 처음 시작할 때 Fragment를 Activity에 추가해야 합니다. 



Reference

1. https://developer.android.com/training/basics/fragments/creating

반응형
반응형

이번 포스팅은 Fragment 에 대하여 자세히 알아보도록 하겠습니다.


Fragment FragmentActivity 내의 어떤 동작 또는 사용자 인터페이스의 일부를 나타냅니다. 여러 개의 프래그먼트를 하나의 액티비티에 결합하여 창이 여러 개인 UI를 빌드할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있습니다. 프래그먼트는 액티비티의 모듈식 섹션이라고 생각하면 됩니다. 이는 자체적인 수명 주기를 가지고, 자체 입력 이벤트를 수신하고, 액티비티 실행 중에 추가 및 삭제가 가능합니다(다른 액티비티에 재사용할 수 있는 "하위 액티비티"와 같은 개념).


프래그먼트는 항상 액티비티 내에서 호스팅되어야 하며 해당 프래그먼트의 수명 주기는 호스트 액티비티의 수명 주기에 직접적으로 영향을 받습니다. 예를 들어 액티비티가 일시정지되는 경우, 그 안의 모든 프래그먼트도 일시정지되며 액티비티가 소멸되면 모든 프래그먼트도 마찬가지로 소멸됩니다. 그러나 액티비티가 실행 중인 동안(onResume 수명 주기 상태에 있을 경우)에는 각 프래그먼트를 추가 또는 제거하는 등 개별적으로 조작할 수 있습니다. 그와 같은 프래그먼트 트랜잭션을 수행할 때는 이를 액티비티가 관리하는 백 스택에도 추가할 수 있습니다. 각 백 스택 항목이 발생한 프래그먼트 트랜잭션의 기록이 됩니다. 이 백 스택을 사용하면 사용자가 프래그먼트 트랜잭션을 거꾸로 돌릴 수 있습니다(뒤로 이동). 이때 Back 버튼을 누르면 됩니다.


프래그먼트를 액티비티 레이아웃에 추가하면, 해당 프래그먼트는 액티비티의 뷰 계층 내에서 ViewGroup에 들어가고 자체적인 뷰 레이아웃을 정의합니다. 액티비티의 레이아웃 파일에서 <fragment> 요소로 프래그먼트를 선언하거나 기존 ViewGroup에 추가하는 방법으로 애플리케이션 코드에서 프래그먼트를 선언하면 액티비티 레이아웃에 프래그먼트를 삽입할 수 있습니다.


모범 사례 가이드를 포함한 수명 주기 처리에 대한 자세한 내용은 다음 참고 자료를 참조하세요.

수명 주기 인식 구성 요소로 수명 주기 처리

앱 아키텍처에 대한 가이드

태블릿 및 핸드셋 지원


Fragment 디자인 철학



Android가 프래그먼트를 처음 도입한 것은 Android 3.0(API 레벨 11)부터입니다. 기본적으로 태블릿과 같은 큰 화면에서 보다 역동적이고 유연한 UI 디자인을 지원하는 것이 목적이었습니다. 태블릿의 화면은 핸드셋 화면보다 훨씬 크기 때문에 UI 구성 요소를 조합하고 상호 교환할 공간이 더 많습니다. 프래그먼트는 개발자가 뷰 계층에 복잡한 변경 내용을 관리하지 않아도 이러한 디자인을 사용할 수 있도록 해줍니다. 액티비티의 레이아웃을 여러 프래그먼트로 나누면 런타임에서 액티비티의 외관을 수정할 수도 있고, 그러한 변경 내용을 해당 액티비티가 관리하는 백 스택에 보존할 수도 있습니다. 이제 프래그먼트는 Fragment suppoert library를 통해 폭넓게 제공됩니다.


예를 들어 뉴스 애플리케이션이라면 하나의 프래그먼트를 사용하여 왼쪽에 기사 목록을 표시하고, 또 다른 프래그먼트로 오른쪽에 기사 내용을 표시할 수 있습니다. 두 프래그먼트 모두 한 가지 액티비티에서 양쪽으로 나란히 나타나며, 각 프래그먼트에 나름의 수명 주기 콜백 메서드가 있고 각자 사용자 입력 이벤트를 따로 처리하게 됩니다. 따라서 사용자는 기사를 선택하는 데 하나의 액티비티를 쓰고 기사를 읽는 데 다른 액티비티를 선택하는 대신, 같은 액티비티 안에서 기사를 선택하고 읽는 과정을 모두 끝낼 수 있습니다.


각 프래그먼트는 모듈식이고 재사용 가능한 액티비티 구성 요소로 디자인해야 합니다. 다시 말해, 각 프래그먼트가 자체적인 수명 주기 콜백으로 레이아웃과 동작을 정의하기 때문에 한 프래그먼트를 여러 액티비티에 포함할 수 있습니다. 그러므로 다시 사용할 것을 염두에 두고 디자인하고 하나의 프래그먼트를 다른 프래그먼트에서 직접 조작하는 것은 삼가야 합니다. 이것이 특히 중요한 이유는 모듈식 프래그먼트를 사용하면 프래그먼트 조합을 여러 가지 화면 크기에 맞춰 변경할 수 있기 때문입니다. 태블릿과 핸드셋을 모두 지원하는 애플리케이션을 디자인하는 경우, 사용 가능한 화면 공간을 사용자 환경에서 최적화하도록 프래그먼트를 여러 레이아웃 구성에 재사용할 수 있습니다.


여러 가지 화면 구성에 맞게 여러 가지 프래그먼트 조합으로 애플리케이션을 디자인하는 법에 대한 보다 더 자세한 내용은 화면 호환성 개요에 대한 가이드를 참조 부탁드립니다.


Reference

1. https://developer.android.com/guide/components/fragments

반응형
반응형


이번 포스팅은 Android에서 Button 위젯의 배경을 투명하게 하는 방법에 대하여 알아보도록 하겠습니다.


1. 첫번째 방법은 android:background="#00ff0000" 으로 xml에 적용하는 것입니다.


<Button

        android:id="@+id/bt_confirm"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:background="#00ff0000" />


2. 두번째 방법은 Android 내부에 이미 선언된 transparent color를 사용하는 것입니다.


<Button

        android:id="@+id/bt_confirm"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:background="@android:color/transparent" />


위의 첫번째 방법과 두번째 방법이 있지만 두번째 방법의 경우 Theme 에 따라 투명도가 정상적으로 작동하지 않을 수도 있으니 참고 하시기 바랍니다.


여기에서 첫번째 방법에 사용한 "#00ff0000" 값에 대하여 궁금하신 분도 계실 수도 있어 간단하게 설명드리도록 하겠습니다.

"#" 이하부터 "00ff0000" 라는 총 8자리 문자열을 00 / ff / 00 / 00 두 자리씩 나눕니다.

- 첫번째 문자열 "00" 은  투명도를 나타냅니다. 

- 두번째 문자열 "ff" 는  적색을 나타냅니다.

- 세번째 문자열 "00" 은 녹색을 나타냅니다.

- 네번째 문자열 "00" 은 청색을 나타냅니다.


적색과 녹색, 청색의 조화로 인해 새로운 Color 가 나타나게 됩니다.


반응형

+ Recent posts