简体   繁体   English

android中的背压碎片问题

[英]Back press fragments issue in android

I have four Fragments: A, B, C, D. Now I am moving from A --> B so my code will be我有四个片段:A、B、C、D。现在我从 A --> B 移动,所以我的代码将是

from A to BA 到 B

getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame, new B())
    .addToBackStack("A")
    .commit();

Now from B to C so code will be现在从B 到 C所以代码将是

getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame, new C())
    .addToBackStack("B")
    .commit();

Now from C to D .现在从C 到 D But I don't want to include C in backstack because on back press I don't want C fragment to be shown.但我不想在 backstack 中包含 C,因为在按下时我不想显示 C 片段。

 getActivity().getSupportFragmentManager()
     .beginTransaction()
     .replace(R.id.content_frame, new D())
     .commit();

Now when I press Back button it will work perfectly upto A. Now if I repeat same process again.现在,当我按下“返回”按钮时,它将完美地工作到 A。现在,如果我再次重复相同的过程。 Now again on back press From D Fragment, I will be sent directly on A fragment instead of B fragment.现在再次按下 From D Fragment,我将直接发送到 A 片段而不是 B 片段。 Can you please figure it out the mistake that I am doing in above code?你能找出我在上面代码中做的错误吗?

You have to provide same String value for addToBackStack for single Stack.您必须为单个堆栈的 addToBackStack 提供相同的字符串值。

.replace(R.id.content_frame, new B())
.addToBackStack("stack") 

.replace(R.id.content_frame, new C())
.addToBackStack("stack") 

Here is the code of BackStackChangedListener.这是 BackStackChangedListener 的代码。

public  static void performNoBackStackTransaction( final FragmentManager fragmentManager, String tag, Fragment fragment) {
    final int newBackStackLength = fragmentManager.getBackStackEntryCount() +1;

    fragmentManager.beginTransaction()
            .replace(R.id.content_frame, fragment, tag)
            .addToBackStack(tag)
            .commit();

    fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            int nowCount = fragmentManager.getBackStackEntryCount();
            if (newBackStackLength != nowCount) {
                // we don't really care if going back or forward. we already performed the logic here.
                fragmentManager.removeOnBackStackChangedListener(this);

                if ( newBackStackLength > nowCount ) { // user pressed back
                    fragmentManager.popBackStackImmediate();
                }
            }
        }
    });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM