본문 바로가기

Mobile/Android

[ Android ] Fragment 중첩 쌓기 예제 기본 및 응용(값 전달)

반응형
반응형



MainActivity.java

Fragment fragment, parentFragment;

public void AddFragmentView(Fragment fragment, Fragment parentFragment) {
    this.fragment = fragment;
    this.parentFragment = parentFragment;
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.add(R.id.main_container, fragment);
    fragmentTransaction.addToBackStack(fragment.toString());
    fragmentTransaction.commit();
}




Fragment
✅ 현재에서 다음으로 넘어갈 때, 현재 값을 가지고 감
 fragment : 다음, parentFragment : 현재
ex) 
MessageFragment -> 메세지 목록을 보여줌
MessageViewFragment -> 메세지 상세보기


MessageViewFragment.java (기본)

private static MessageViewFragment fragment;

public static MessageViewFragment newInstance() {
    fragment = new MessageViewFragment();
    return fragment;
}



MessageViewFragment.java (응용 - 값 전달)

private static MessageViewFragment fragment;

public static MessageViewFragment newInstance(Message msg) {
    fragment = new MessageViewFragment();
    Bundle args = new Bundle();
    args.putSerializable("message", msg);
    fragment.setArguments(args);
    
    return fragment;
}



MessageFragment.java
@OnClick -> 리싸이클러뷰에 대한 click listener 이라고 가정

private static MessageFragment mFragment;

public void onClick() {
Message msg = mAdapter.getItem(pos); // click한 메세지 데이터
	((MainActivity)getActivity()).AddFragmentView(
    	MessageViewFragment.newInstance(msg), mFragment
    );
}

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    int backStackEntryCount = fm.getBackStackEntryCount();
    if (backStackEntryCount == 0) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder
            .setMessage("정말로 종료하시겠습니까?")
            .setPositiveButton("취소", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.cancel();
                }
            })
            .setNegativeButton("확인", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    finish();
                }
            });
        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    } else {
        fm.popBackStack();
        if(fragment.toString().contains("OrderFragment")){
            ((MainFragment)parentFragment).resetData();
        }
    }
}
반응형