본문 바로가기

PROGRAMING/Android

Fragment에서 BackStack 사용시 현재 전면에 나와있는 Fragment알아오기(OnBackStackChangedListener)

1번째 방법 FragmentTransction을 commit 할때 setBreadCrumbTitle등의 함수를 이용하여

Transection에 추가 정보를 넣는다.


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button btnFisrt = (Button) findViewById(R.id.btnFirst);

Button btnSecond = (Button) findViewById(R.id.btnSecond);

Button btnThree = (Button) findViewById(R.id.btnThree);

mTextView = (TextView) findViewById(R.id.textView1);


btnFisrt.setOnClickListener(this);

btnSecond.setOnClickListener(this);

btnThree.setOnClickListener(this);


FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.add(R.id.frameLayout, mFirstFragment, FRAGMENT_FIRST);

ft.setBreadCrumbTitle(R.id.btnFirst);

ft.commit();

mTextView.setText("btnFirst");

}



@Override

public void onClick(View v) {

if (v.getId() == R.id.btnFirst) {

Log.d(CLASSNAME, "onClick R.id.btnFirst");

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.replace(R.id.frameLayout, mFirstFragment, FRAGMENT_FIRST);

ft.setBreadCrumbTitle(R.id.btnFirst);

ft.addToBackStack(null);

ft.commit();

mTextView.setText("btnFirst");

} else if (v.getId() == R.id.btnSecond) {

Log.d(CLASSNAME, "onClick R.id.btnSecond");

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.replace(R.id.frameLayout, mSecondFragment, FRAGMENT_SECOND);

ft.setBreadCrumbTitle(R.id.btnSecond);

ft.addToBackStack(null);

ft.commit();

mTextView.setText("btnSecond");

} else if (v.getId() == R.id.btnThree) {

Log.d(CLASSNAME, "onClick R.id.btnThree");

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.replace(R.id.frameLayout, mThreeFragment, FRAGMENT_THREE);

ft.setBreadCrumbTitle(R.id.btnThree);

ft.addToBackStack(null);

ft.commit();

mTextView.setText("btnThree");

}

}




OnBackStackChangedListener mOnBackStackChangedListener = new OnBackStackChangedListener() {

@Override

public void onBackStackChanged() {

LOG.i(CLASSNAME, "onBackStackChanged");

LOG.d(CLASSNAME,"onBackStackChanged getFragmentManager().getBackStackEntryCount() : "+ getFragmentManager().getBackStackEntryCount());


int i = getFragmentManager().getBackStackEntryCount();

if (i > 0) {

BackStackEntry tt = getFragmentManager().getBackStackEntryAt(i - 1);

int checkedId = tt.getBreadCrumbTitleRes();

LOG.i(CLASSNAME, "onBackStackChanged  checkedId : " + checkedId);

switch (checkedId) {

case R.id.btnFirst:

mTextView.setText("btnFirst");

break;

case R.id.btnSecond:

mTextView.setText("btnSecond");

break;

case R.id.btnThree:

mTextView.setText("btnThree");

break;

}

} else {

//최초 add 한 것은 BasckStack을 가지지 않으므로 카운트가 0이다.

//그러므로 처음 무조건 add한 FirstFragment로 가정하고 아래와 같이 세팅해준다.

mTextView.setText("btnFirst");

}

}

};

@Override

protected void onResume() {

super.onResume();

getFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);

}


@Override

protected void onPause() {

super.onPause();

getFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);

}


스크린 샷.


TextView를 버튼 옆에 두어 현재 보여지고 있는 Fragment가 무엇인지 표시한다.


OnBackStackChangedListener는 BackStack에 변경되었을 경우 호출되는 이벤트로

버튼을 클릭하여 BackStack이 추가되었거나 Back Key를 눌러 BackStack이 제거 되었을 경우 호출된다. 

해당 Linstener를 구현하여 TextView에  Transection에 대한 정보를

기반으로 현재 화면에 보여지고 있는 Fragment를 유추하여 표시하였다.


아래는 위 내용에 대한 예제 소스 이다.


FragmentBackStack_check_fragment_info.zip


전면에 나와있는 Fragment를 알아오는 방법은 알아내지 못했다.