android - 为什么在调用第一个 fragment 时会自动调用第二个 fragment ?

标签 android android-fragments android-viewpager fragmentpageradapter

我正在使用 ViewPager 显示 4 个 fragment ,但问题是在加载第一个 fragment 时,第二个 fragment 也被调用,即两个 fragment 的 onActivityCreate() 方法被一起调用并在滑动时被调用到第二个 fragment 第三个 fragment 的 onActivityCreate() 等等对于其他 fragment 和最后一个 fragment 没有 onActivityCreate() 被调用。如何解决。

这是我的文件:

购买详情

public class PurchaseDetails extends AppCompatActivity implements ActionBar.TabListener {

    ViewPager viewPager;
    ActionBar actionBar;

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



        viewPager=findViewById(R.id.master_purchase_pager);

        FragmentManager fm=getSupportFragmentManager();

        actionBar = getSupportActionBar();
actionBar.setTitle("Purchase Details");
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        viewPager.setAdapter(new PurchaseFragmentAdapter(fm));
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });



        ActionBar.Tab tab1 = actionBar.newTab();
        tab1.setText("Date Selector");
        tab1.setTabListener(this);


        ActionBar.Tab tab2 = actionBar.newTab();
        tab2.setText("Week");
        tab2.setTabListener(this);


        ActionBar.Tab tab3 = actionBar.newTab();
        tab3.setText("Month");
        tab3.setTabListener(this);


        ActionBar.Tab tab4 = actionBar.newTab();
        tab4.setText("Year");
        tab4.setTabListener(this);



        actionBar.addTab(tab1);
        actionBar.addTab(tab2);
        actionBar.addTab(tab3);
        actionBar.addTab(tab4);


    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {

    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {

    }
}

购买 fragment 适配器

public class PurchaseFragmentAdapter extends FragmentPagerAdapter {
    public PurchaseFragmentAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment=null;

        if(position==0)
        {
            fragment= new PurchaseDateSelector();
        }
        else if(position==1)
        {
            fragment= new PurchaseWeek();
        }
        else if(position==2)
        {
            fragment= new PurchaseMonth();
        }
        else if(position==3)
        {
            fragment= new PurchaseYear();
        }


        return fragment;
    }

    @Override
    public int getCount() {
        return 4;
    }


}

购买日期选择器

public class PurchaseDateSelector extends Fragment
{


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {


return inflater.inflate(R.layout.purchase_date_selector_fragment,container,false);
    }




    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Toast.makeText(getActivity(), "Purchase Date Selector", Toast.LENGTH_SHORT).show();


}

}

采购周

public class PurchaseWeek extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.purchase_week_fragment,container,false);


    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Toast.makeText(getActivity(), "Purchase Week", Toast.LENGTH_SHORT).show();

    }


}

采购月份

public class PurchaseMonth extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.purchase_month_fragment,container,false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Toast.makeText(getActivity(), "Purchase Month", Toast.LENGTH_SHORT).show();

    }
}

采购年份

public class PurchaseYear extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.purchase_year_fragment,container,false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Toast.makeText(getActivity(), "Purchase Year", Toast.LENGTH_SHORT).show();
    }
}

最佳答案

ViewPager 不会一次创建所有页面。当使用大量页面时,如果用户永远不会滑动浏览所有这些页面,这将非常慢,甚至是不必要的。默认情况下,ViewPager 仅创建当前页面以及当前页面左侧和右侧的离屏页面。

enter image description here

那么这个问题的解决方案是什么,有什么办法吗?

是的,有,

mViewPager.setOffscreenPageLimit(int limit);

Parameters : limit – How many pages will be kept offscreen in an idle state.

ViewPager 至少需要 1 个离屏页面

如果您将值设置为 0,那么您应该会在 LogCat 中收到关于此的警告,例如:

Requested offscreen page limit 0 too small;

默认为1 这是因为 ViewPager 基于准备好要加载的下一页的概念。 ViewPager 无法查看不存在的页面。

感谢Tech Code Geek

关于android - 为什么在调用第一个 fragment 时会自动调用第二个 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48201012/

相关文章:

Java套接字编程: Detect whether client and server are connected

带主页按钮的 Android ABS 中心标题

Android按钮onClick拦截滚动

Android 将 fragment 保存到抽屉导航中

java - 如何初始化在 Activity 中定义的界面,该界面是通过 TabLayout 使用 ViewPager 设置的 3 个 fragment 实现的?

android - Android中如何通过点击按钮实现滑动 Action ?

android - 如何使用 Flutter/Dart 在设备之间发送和接收数据?

android - 为什么我在文件系统中找不到我的 SQLite 数据库?

android - 在 BottomNavigationView 中的 fragment 之间导航的正确方法是什么?

android - ViewPagerIndicator 在 setCurrentItem() 之后没有更新