프로그래밍 방식으로 백 스택의 이전 조각으로 돌아갑니다. FragmentTransaction ft

프로그래밍 방식으로 조각이 추가 된 활동이 있다고 가정 해보십시오.

private void animateToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

보이는 이전 조각으로 돌아가는 가장 좋은 방법은 무엇입니까?

안드로이드에서 버튼 클릭시 트리거 백 버튼 기능을 발견 했지만 백 키 이벤트를 시뮬레이션하는 것이 올바른 방법이 아니라고 생각합니다 (그리고 작동하지 않을 수도 있음).

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));

전화 finish()하면 관심이없는 활동이 종료됩니다.

이것에 대해 더 좋은 방법이 있습니까?



답변

getFragmentManager().popBackStack()방법을 살펴보십시오 (선택할 수있는 몇 가지가 있음)

http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack ()


답변

제공된 다른 답변을 자세히 설명하기 위해 이것은 내 솔루션입니다 (활동에 배치).

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}

답변

조각을 업데이트 / 추가 할 때

를 포함해야합니다 .addToBackStack().

getSupportFragmentManager().beginTransaction()
    .add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
    .addToBackStack(null)
    .commit();

그 후 getFragments.popBackStackImmediate()조각을 추가 / 업데이트하면 true를 반환하고 현재 화면으로 돌아갑니다.


답변

해당 줄을 onBackPressed () 메서드에 추가하십시오. 백 스택에 프래그먼트가 있으면 popBackStackImmediate () 메소드로 이전 프래그먼트로 돌아갑니다.

if(getFragmentManager().getBackStackEntryCount() > 0){
     getFragmentManager().popBackStackImmediate();
}
else{
    super.onBackPressed();
}

`


답변

이 솔루션은 기본 조각에서 다시 누르면 앱을 닫고 싶을 때 하단 막대 기반 조각 탐색에 완벽하게 작동합니다.

반면에 내 코드에서 “DetailedPizza”로 정의 된 보조 조각 (조각 조각)을 열면 이전 조각의 기본 조각이 반환됩니다. 건배!

다시 눌러 진 내부 활동은 다음과 같습니다.

Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");

if (home instanceof FragmentDetailedPizza && home.isVisible()) {
    if (getFragmentManager().getBackStackEntryCount() != 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
} else {
    //Primary fragment
    moveTaskToBack(true);
}

다음과 같이 다른 조각을 시작하십시오.

Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();

답변

addToBackStack ()이 프래그먼트 트랜잭션에 추가되어 있지 않은 경우 이러한 답변이 작동하지 않지만 다음을 사용할 수 있습니다.

getActivity().onBackPressed();

당신의 조각에서 한 걸음 뒤로 가십시오.


답변

다음 코드를 사용하여 프로그래밍 방식으로 이전 조각으로 돌아갑니다.

if ( getFragmentManager().getBackStackEntryCount() > 0) 
{
          getFragmentManager().popBackStack();
          return;
}
super.onBackPressed();