한 화면을 여러 공간으로 쪼개어 사용하거나 액티비티 이동없이 화면 내부구성을 다른 레이아웃으로
교체 시킬 때 등 Fragment는 여러 군데에서 사용되어지고 있습니다.
Fragment 란 ? : http://androidhuman.tistory.com/469
Fragment를 사용하려면 그것을 사용하는 상위 activity가 FragmentActivity 여야 합니다.
Fragment 생명주기는 activity와 흡사하며 주의 할 점이 activity에서 this로 쓰던 부분을 getActivity()로
바꿔 써주셔야 합니다.
큰 구성은 FragmentActivity를 상속받은 MainActivity.java 가 있고 Fragment 를 상속받은
OneFragment, TwoFragment, ThreeFragment.java 세가지 클래스를 만든다음
activity_main.xml에 있는 ll_fragment 영역에 위에만든 세가지 fragment 를 삽입하는 방식입니다.
먼저 MainActivity 구성입니다.
위 그림과 같이 activity_main.xml 레이아웃 하나에 fragment 가 교체 될 영역과 그 영역을 컨트롤 할
메뉴 뷰 를 만들어 줍니다.
<MainActivity>
public class MainActivity extends FragmentActivity implements OnClickListener {
final String TAG = "MainActivity";
int mCurrentFragmentIndex;
public final static int FRAGMENT_ONE = 0;
public final static int FRAGMENT_TWO = 1;
public final static int FRAGMENT_THREE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_oneFragment = (Button) findViewById(R.id.bt_oneFragment);
bt_oneFragment.setOnClickListener(this);
Button bt_twoFragment = (Button) findViewById(R.id.bt_twoFragment);
bt_twoFragment.setOnClickListener(this);
Button bt_threeFragment = (Button) findViewById(R.id.bt_threeFragment);
bt_threeFragment.setOnClickListener(this);
mCurrentFragmentIndex = FRAGMENT_ONE;
fragmentReplace(mCurrentFragmentIndex);
}
public void fragmentReplace(int reqNewFragmentIndex) {
Fragment newFragment = null;
Log.d(TAG, "fragmentReplace " + reqNewFragmentIndex);
newFragment = getFragment(reqNewFragmentIndex);
// replace fragment
final FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.ll_fragment, newFragment);
// Commit the transaction
transaction.commit();
}
private Fragment getFragment(int idx) {
Fragment newFragment = null;
switch (idx) {
case FRAGMENT_ONE:
newFragment = new OneFragment();
break;
case FRAGMENT_TWO:
newFragment = new TwoFragment();
break;
case FRAGMENT_THREE:
newFragment = new ThreeFragment();
break;
default:
Log.d(TAG, "Unhandle case");
break;
}
return newFragment;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_oneFragment:
mCurrentFragmentIndex = FRAGMENT_ONE;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_twoFragment:
mCurrentFragmentIndex = FRAGMENT_TWO;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_threeFragment:
mCurrentFragmentIndex = FRAGMENT_THREE;
fragmentReplace(mCurrentFragmentIndex);
break;
}
}
}
전체적으로 보면 fragment 마다 int으로된 구분자를 주고 메뉴 버튼이 클릭 될 때마다 해당 fragment의
index를 mCurrentFragmentIndex 라는 int 형 변수에 담아 fragment 교체 매소드를 태우는 식입니다.
onCreate부터 보면 메뉴 버튼등록과 리스너를 달고 mCurrentFragmentIndex에 첫 화면 fragment인
FRAGMENT_ONE 를 넣어주고 fragmentReplace 매소드를 타게됩니다.
fragmentReplace 매소드에는 넘겨받은 fragment index를 가지고 getFragment 매소드를 가서
실질적인 fragment의 객체 생성을 하고 그 객체를 리턴해줍니다.
다시 fragmentReplace매소드로 돌아와 리턴받은 fragment로 ll_fragment 라는 레이아웃 영역에
교체를 하게 됩니다. 다른 버튼을 눌렀을 때도 이와 같은 방식으로 동작하게 됩니다.
Fragment 들은
public class OneFragment extends Fragment implements OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.onefragment, container, false);
Button button = (Button) v.findViewById(R.id.bt_ok);
button.setOnClickListener(this);
return v;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_ok:
Toast.makeText(getActivity(), "OneFragment", Toast.LENGTH_SHORT)
.show();
break;
}
}
}
이처럼 Activity와 비슷한 구조이고
마지막으로 activity_main.xml 구조입니다.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffffff"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/ll_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:background="#ffffffff"
android:orientation="horizontal" >
<Button
android:id="@+id/bt_oneFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1" />
<Button
android:id="@+id/bt_twoFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="2" />
<Button
android:id="@+id/bt_threeFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="3" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
ll_fragment 라는 영역이 Fragment들이 교체 될 영역입니다.