简体   繁体   English

切换片段时滞后的滑动选项卡

[英]Swipe tabs lagging when switching fragments

i have a little problem, i just have 3 fragments and i added to one of them a photoshop background (1080 x 1920) the thing is that when it loads to the phone the switching between the tabs lags a lot , but if i just render the image to 720 x 1280 it works fine and no lag appear, i implemented mViewPager.setOffscreenPageLimit(0); 我有一个小问题,我只有3个片段,我在其中之一中添加了Photoshop背景(1080 x 1920),问题是,当它加载到手机上时,选项卡之间的切换会滞后很多,但是如果我只是渲染图像到720 x 1280,效果很好,没有滞后出现,我实现了mViewPager.setOffscreenPageLimit(0); but it seems it dosnt work , i dont know what is causing the problem, i will let here my main code, thanks in advanced 但它似乎不起作用,我不知道是什么引起了问题,我将把我的主要代码放到这里,谢谢高级

import android.support.design.widget.TabLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

import android.widget.ExpandableListView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link FragmentPagerAdapter} derivative, which will keep every
     * loaded fragment in memory. If this becomes too memory intensive, it
     * may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    private SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setOffscreenPageLimit(0);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }




    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */


    //-----------------------FRAGMENTS-----------------------

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).


            switch (position) {
                case 0:
                    Fragment fragment = new DummySectionFragment3();
                    Bundle args = new Bundle();
                    args.putInt(DummySectionFragment3.ARG_SECTION_NUMBER, position + 1);
                    fragment.setArguments(args);
                    return fragment;

                case 1:
                    Fragment fragment2 = new DummySectionFragment2();
                    Bundle args2 = new Bundle();
                    args2.putInt(DummySectionFragment2.ARG_SECTION_NUMBER, position + 2);
                    fragment2.setArguments(args2);
                    return fragment2;

                case 2:

                    Fragment fragment3 = new DummySectionFragment();
                    Bundle args3 = new Bundle();
                    args3.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 3);
                    fragment3.setArguments(args3);
                    return fragment3;


                default:
                    return null;
            }
        }
        //-----------------------FRAGMENTS-----------------------



        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }



        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Bares";
                case 1:
                    return "No se";
                case 2:
                    return "Eventos";
            }
            return null;
        }
    }





    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private static final String ARG_SECTION_NUMBER = "section_number";

        /**
         * Returns a new instance of this fragment for the given section
         * number.
         */
        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        public PlaceholderFragment() {
        }




        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
            dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
            return rootView;
        }
    }
    }

i implemented mViewPager.setOffscreenPageLimit(0); 我实现了mViewPager.setOffscreenPageLimit(0); but it seems it dosnt work 但似乎没有用

Firstly, 首先,

Why did you set page limit to 0 if you are hoping for a smoother swipe ? 如果希望滑动更流畅, 为什么将页面限制设置为0

Do it as (if you have 3 tabs just set limiit to 1 , if 5 tabs, setting it to 2 would work) 这样做(如果您有3标签,只需将limiit设置为1 ,如果有5个标签,则将其设置为2

mViewPager.setOffscreenPageLimit(2); 

this means you are forcing caching of your 2 left and 2 right tabs from current tab. 这意味着您正在从当前选项卡中强制caching左2个和右2个选项卡。

So that they wont be loaded again and again instead they would be cached. 这样就不会一次又一次地加载它们,而是将其缓存。

NOTE Having said that, you should keep in mind that it would consume more memory and avoid unnecessary memory consumption. 注意尽管如此,您应该记住它会消耗更多的内存并避免不必要的内存消耗。

hope it helped someone. 希望它对某人有所帮助。

You don't say how you load the background. 您没有说如何加载背景。

But, if you've simply just set in the fragment layout then the image gets loaded when you inflate the XML. 但是,如果仅设置片段布局,则在为XML充气时会加载图像。 This happens in the UI thread. 这发生在UI线程中。 The larger the image the longer it takes. 图像越大,所需时间越长。

I would recommend loading images with an async library like Picasso . 我建议使用Picasso这样的异步库加载图像。

I had the same problem. 我有同样的问题。 First I thought the data size of the image was to big but that wasn't the case. 首先,我认为图像的数据大小很大,但事实并非如此。 I changed the measurement of the image in Photoshop and decreased the width. 我在Photoshop中更改了图像的尺寸并减小了宽度。 Now it works fine. 现在工作正常。

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

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