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


218

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

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()하면 관심이없는 활동이 종료됩니다.

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

답변:


354

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

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


91
getFragmentManager().popBackStackImmediate();트릭을했다. 감사.
Aske B.

1
그래도이 방법을 어디에 두겠습니까? 내 탭 리스너에서?
rasen58

1
코드를 보지 않고 말하기는 어렵지만 현재 조각을 "닫고"이전 조각으로 돌아 가려고 할 때 실행되는 코드 섹션으로 이동해야합니다.
stickless

1
어떤에서 getSupportFragmentManager ()에 대한
ViliusK

5
코드에 "addToBackStack ("tag ")"를 추가하는 것을 잊지 마십시오. "fragmentManager.beginTransaction (). replace (R.id.content_frame, fragment) .addToBackStack ("tag "). commit ();" addToBackStack (null)을 작성하면 자체적으로 처리하지만 태그를 제공하면 수동으로 처리해야합니다.
Khaled Saif

129

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

@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();  
    }
}

5
왜 그런 일이 일어나고 있습니까? 조각 예제 developer.android.com/training/basics/fragments/index.html에서 이들은 onbackpressed 이벤트를 무시하지 않지만 조각을 백스 택할 수 있습니다. trasaction.addToBackStack (null);을 사용했습니다. 그러나 아무 일도 일어나지 않습니다. 이유를 설명해 주시겠습니까?
Murtaza는 Hussain을 Khursheed

@MurtazaHussain 도움이 필요하면 새로운 질문을해야합니다. 더 많은 코드를 보지 않고 무슨 일이 일어나고 있는지 보는 것은 조금 어렵습니다.
Kyle Falconer

2
내 경우 fm.getBackStackEntryCount() > 1에는 스택의 첫 번째 조각 만있을 때 활동을 다시 호출하기 위해 해야 했습니다.
Facundo Olano

3
안드로이드 이미이 작업을 수행 : "하여 FragmentTransaction가 다시 스택에 객체와 사용자의 FragmentManager가 다시 스택 및 트랜잭션 경우 조각을 제거하는 등 수행하는 역 동작을 (떨어져 가장 최근의 거래를 팝업 뒤로 버튼을 누르면이있는 경우 추가했습니다. ") (출처)
artkoenig

29

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

를 포함해야합니다 .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를 반환하고 현재 화면으로 돌아갑니다.


7

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

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

`


5

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

반면에 내 코드에서 "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();

3

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

getActivity().onBackPressed();

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


1

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

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

1

해당 조각을 다시 만들려면 백 프레스에 해당 조각을 추가하면됩니다. 예 :

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Fragment fragment = new LoginFragment();
        //replacing the fragment
        if (fragment != null) {
            FragmentTransaction ft = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment);
            ft.addToBackStack("SignupFragment");
            ft.commit();
        }
    }
});

위의 경우, 나는 개방하고 LoginFragmentButton button를 누르면, 현재 사용자가에 SignupFragment. 따라서 addToBackStack(TAG)를 호출하면 어디 TAG = "SignupFragment"에서 뒤로 버튼을 누를 때로 돌아 LoginFragment갑니다 SignUpFragment.

행복한 코딩!


TAG는 영향을 미치지 않으며 심지어 null 일 수도 있습니다.
CoolMind

1

fragment_tran.addToBackStack(null)마지막 조각 을 추가 하면 마지막 조각을 다시 올릴 수 있습니다.

새로운 조각 추가 :

view.findViewById(R.id.changepass).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.container, new ChangePassword());
            transaction.addToBackStack(null);
            transaction.commit();
        }
    });

1

나는 여기에 같은 아이디어가 나왔고 그 동안 나는 나쁘지 않다고 생각하고 ViewPager와 함께 작동한다고 생각했다.

그래서 내가 한 일은 viewPager를 보유하는 부모 활동에서 onBackPressed 메소드를 재정의하고 첫 번째 조각에 도달 할 때까지 항상 빼기 1 위치로 돌아간 다음 활동을 닫는 것입니다.

@Override
public void onBackPressed() {
    if(viewPager.getCurrentItem()>0){
        viewPager.setCurrentItem(viewPager.getCurrentItem()-1);
    } else {
        super.onBackPressed();
        this.close();
    }
}

private void close(){
    this.finish();
}

매번 한 방향으로 만 돌아가는 것처럼 하락이있을 수 있으므로 탭이 있고 조각을 건너 뛴 위치를 전환하지 않으면 제대로 작동하지 않을 수 있습니다 (0에서 2로 이동 한 다음 뒤로 키를 누르면 0 대신 1)

내 경우에는 탭이없는 viewPager에 2 개의 조각이있어서 잘 작동합니다.


비슷한 질문에 이미 답변되어 있습니다. stackoverflow.com/questions/10863572/…
AtifSayings

0

아래 코드를 사용해보십시오 :

@Override
    public void onBackPressed() {
        Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.container);
        if (myFragment != null && myFragment instanceof StepOneFragment) {
            finish();
        } else {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.