相关文章推荐
爽快的夕阳  ·  IPv6 support in Java ...·  1 年前    · 
寂寞的茄子  ·  abap - WSAECONNRESET: ...·  1 年前    · 

I have created one activity and 2 fragments. Fragment B is inside Fragment A. When I click on back button on my phone it doesn't go to Fragment A from Fragment B. But it crashes the app. I am maintaining a Stack.

public void ShowFragment(SupportFragment fragment)
            if (fragment.IsVisible)
                return;
            Android.Support.V4.App.FragmentTransaction trans = SupportFragmentManager.BeginTransaction();
            fragment.View.BringToFront(); 
            trans.Hide(mCurrentFragment);
            Console.WriteLine("Hiding fragemnt current " + mCurrentFragment.Tag+" fragment "+fragment.Tag);
            trans.Show(fragment);
            if (mStackFragments.Count != 0)
                SupportFragment sf = mStackFragments.Pop();
                if (fragment != sf)
                    mStackFragments.Push(sf);
                    mStackFragments.Push(fragment);
                    mStackFragments.Push(sf);
                mStackFragments.Push(fragment);
            mCurrentFragment = fragment;
            trans.Commit();
            LoadFragmentTitleTxtView();
            LoadActionBarSpinner();

above method is used to show the fragment/main screen, whereas the following code is for OnBackPressed.

public override void OnBackPressed()
            if (mDrawerLayout.IsDrawerOpen((int)GravityFlags.Left))
                mDrawerLayout.CloseDrawer((int)GravityFlags.Left);
                if (mStackFragments.Count > 1)
                    //mStackFragments.Pop();
                    Console.WriteLine("Popping 1st " + mStackFragments.Pop().Tag+" Count "+mStackFragments.Count);
                    SupportFragment frag = mStackFragments.Pop();
                    Console.WriteLine("Poppoing 2nd " + frag.Tag+" Count "+mStackFragments.Count);
                    if (frag == chaptersFragment)
                        if (chapterfiltertext != "")
                            item.ExpandActionView();
                            sssearchview.SetQuery(chapterfiltertext, false);
                            mainview.Animate().Alpha(1f).SetListener(null);
                    Console.WriteLine("In back method.. "+frag.Tag);
                    ShowFragment(frag);
                    Finish();

its working fine for the fragments which doesn't have any nested fragments within them.

This is the code for the nested fragment B to load it on main screen from fragment A.

FragmentTransaction tx = context.SupportFragmentManager.BeginTransaction();
            FragmentB fragmentB = new FragmentB();
            Bundle args = new Bundle();
            args.PutString("letter", tmp1);
            fragmentB.Arguments = args;
            tx.Replace(Resource.Id.main, fragmentB, "innerDictFrag");
            tx.AddToBackStack(null);
            context.mStackFragments.Push(fragmentB);
            tx.Commit();
			 

Hello,​

Welcome to our Microsoft Q&A platform!

If you want to transfer fragment1 to fragment2, please use the following code, do not change code order. For example, current is fragment1, then I navigate to fragment2

   public class Fragment1 : Fragment  
           public override void OnCreate(Bundle savedInstanceState)  
               base.OnCreate(savedInstanceState);  
               // Create your fragment here  
           public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)  
               View view=   inflater.Inflate(Resource.Layout.layout1, container, false);  
               Button button1 = view.FindViewById<Button>(Resource.Id.button1);  
               button1.Click += Button1_Click;  
               return view;  
           private void Button1_Click(object sender, EventArgs e)  
               FragmentTransaction transaction = this.FragmentManager.BeginTransaction();  
               Fragment2 fragment =   new Fragment2();  
               transaction.AddToBackStack(null);  
               transaction.Replace(Resource.Id.FramePage, fragment);  
               transaction.Commit();  

In the fragment2, you can click the back button to back the fragment1, or click button execute this.FragmentManager.PopBackStack();

   public class Fragment2 : Fragment  
           public override void OnCreate(Bundle savedInstanceState)  
               base.OnCreate(savedInstanceState);  
               // Create your fragment here  
           public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)  
              View view= inflater.Inflate(Resource.Layout.layout2, container, false);  
               Button popBtn = view.FindViewById<Button>(Resource.Id.popBtn);  
               popBtn.Click += PopBtn_Click;  
               return view;  
           private void PopBtn_Click(object sender, EventArgs e)  
               this.FragmentManager.PopBackStack();  

Best Regards,

Leon Lu

If the response is helpful, please click "Accept Answer" and upvote it.

Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.