FragmentTransaction is not allowed to be added to back stack?

前端 未结 4 1975
迷失自我
迷失自我 2021-01-22 21:18

why cant my fragments be added to back stack?

@Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
        FragmentTransaction          


        
相关标签:
4条回答
  • 2021-01-22 22:00

    The only problem in your code is that you 'correctly' create a transaction, but then you never use it. The supplied transaction FragmentTransaction ft cannot be added to the backstack because it is not supported by the listener, however this should work:

    @Override
        public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
    
                ListFragment newListFragment = new ListFragment();
                Fragment newFragment = new EntryFrag();
    
                FragmentTransaction transaction = getFragmentManager().beginTransaction();
                transaction.replace(R.id.frameOne, newListFragment);
                transaction.replace(R.id.frameTwo, newFragment);
    
    
                transaction.addToBackStack(null);
                transaction.commit();
        }
    

    Note the use of transaction.replace(... vice ft.replace(... also you must commit() this yourself, as you properly did, because TabListener will only auto-commit FragmentTransaction ft

    Also, you can read about adding to the back stack not being supported in the TabListener API docs here: http://developer.android.com/reference/android/app/ActionBar.TabListener.html

    0 讨论(0)
  • 2021-01-22 22:12

    You are using Action Bar tabs and you want the Fragments bound to the tabs to be added to the back stack, usually that is forbidden (and it is understandable inmost cases). Action Bar Tabs are not allowed to be added to the Back Stack. If your application is tab based it is ok, but if you display tabs only in particular situations and in others you hide them this behavior is not good (and I do not understand why Google does not let it).....maybe you need the first tab to be added to the back stack (my situation), but in such a case onTabSelected will not allow you to add the transaction to the back stack, it will throw an exception because the addToBackStack is blocked inside this method call (there is the method disallowAddToBackStack inside FragmentTransaction that does exactly that...I totally disagree with that constraint).

    0 讨论(0)
  • 2021-01-22 22:13

    Im not getting why you are instantiating a new FragmentTransaction inside your function, just use the one passed as a parameter. I didnt test this, but im pretty sure that it should work.

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
            ListFragment newListFragment = new bListFragment();
            Fragment newFragment = new EntryFrag();
            ft.replace(R.id.frameOne, newListFragment);
            ft.replace(R.id.frameTwo, newFragment);
            ft.addToBackStack(null);
            ft.commit();
    }
    
    0 讨论(0)
  • 2021-01-22 22:15

    Get rid of your transaction and, instead, use the FragmentTransaction provided in the callback. There's no need to instantiate a new FragmentTransaction when one is already handed to you. Pass in whatever you want into your call to ft.addToBackstack(); and then call ft.commit();

    0 讨论(0)
提交回复
热议问题