Android how to stop refreshing Fragments on tab change

前端 未结 7 1348
小蘑菇
小蘑菇 2020-12-12 22:09

I have the following code :

MainActivity.java

package com.erc.library;

import java.io.BufferedInputStream;
import java.io.File;
imp         


        
相关标签:
7条回答
  • 2020-12-12 22:43

    you can handle view recreation by check if the view is null or not

    public class FragmentExample extends Fragment {
    
        private View rootView;
    
        public FragmentExample() {}
    
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
    
        if (rootView == null) {
    
            rootView = inflater.inflate(R.layout.fragment_example_layout, container, false);
    
            // Initialise your layout here
    
        } else {
            ((ViewGroup) rootView.getParent()).removeView(rootView);
        }
    
        return rootView;
        }
    }
    
    0 讨论(0)
  • 2020-12-12 22:48

    one has to instance the FragmentPagerAdapter first, then .getCount() will return a value -

    while .getCount() - 1 should be set as the default off-screen limit:

    TabsPagerAdapter adapter = new TabsPagerAdapter(getSupportFragmentManager());
    
    /* the ViewPager requires a minimum of 1 as OffscreenPageLimit */
    int limit = (adapter.getCount() > 1 ? adapter.getCount() - 1 : 1);
    
    ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(limit);
    
    0 讨论(0)
  • 2020-12-12 22:50

    In the onCreate() of your fragments, call setRetainInstance(true)

    0 讨论(0)
  • 2020-12-12 22:52

    By default, ViewPager recreates the fragments when you swipe the page. To prevent this, you can try one of three things:

    1. In the onCreate() of your fragments, call setRetainInstance(true).

    2. If the number of fragments is fixed & relatively small, then in your onCreate() add the following code:

    mViewPager = (ViewPager)findViewById(R.id.pager);
    mViewPager.setOffscreenPageLimit(limit);         /* limit is a fixed integer*/
    

    3. Use a FragmentPagerAdapter as part of your ViewPager.

    If I remember correctly, the second option is more promising. But I urge you to try all three and see which of them work.

    0 讨论(0)
  • 2020-12-12 22:56

    Since the activity implements ActionBar.TabListener, the activity's onCreate() is getting called again and again. So place the following code in onResume() method:

       // Initilization
        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getActionBar();
        mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    
        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
    
        // Adding Tabs
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name)
                    .setTabListener(this));
        }
    
        /**
         * on swiping the viewpager make respective tab selected
         * */
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    
            @Override
            public void onPageSelected(int position) {
                // on changing the page
                // make respected tab selected
                actionBar.setSelectedNavigationItem(position);
            }
    
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }
    
            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });
    
    0 讨论(0)
  • 2020-12-12 23:03

    In my case above suggestion does not work.

    To restrict recreation of fragment, what i did:

    In onCreateView you can store inflated view in a global variable and initialize it only if it is null, like in this code:

        var root:View?=null
        var apiDataReceived=false
     override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        if (root==null)
            root=inflater!!.inflate(R.layout.fragment_layout, container, false)
        return root
    }
    

    Now if you are parsing some data and fill it into RecyclerView or any other View

    1. Make a global variable like in above code apiDataReceived

    2. Set it to true if you successfully parsed data.

    3. Before apiCalls place a condition like this:

      if (!apiDataReceived) { apiCalls() }

    So if apiCalls() would be called only if data is not parsed.

    Do your http calls and parsing or any other thing in method which called after onCreateView like onStart

    The above code is in kotlin, If you are facing any issue, let me know in comments.

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