为什么调用第一个片段第二个片段会被自动调用?

时间:2018-01-11 06:29:40

标签: android android-fragments android-viewpager fragmentpageradapter

我正在使用ViewPager来显示4个片段,但问题是在加载第一个片段时,第二个片段也被调用,即两个片段的onActivityCreate()方法被调用在一起并且在刷到第二个片段第三个片段时onActivityCreate()等等,对于其他片段和最后片段,不会调用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) {

    }
}

PurchaseFragmentAdapter

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;
    }


}

PurchaseDateSelector

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();


}

}

PurchaseWeek

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();

    }


}

PurchaseMonth

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();

    }
}

PurchaseYear

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();
    }
}

3 个答案:

答案 0 :(得分:1)

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

enter image description here

那么这个问题的解决方案是什么,是他们的吗?

是的,有,

mViewPager.setOffscreenPageLimit(int limit);
  

参数:limit - 空闲时屏幕外保留的页数   状态。

ViewPager至少需要1个屏幕外页面

如果您将value设置为0,那么您应该在LogCat中收到有关此内容的警告,例如:

  

请求的屏幕外页面限制0太小;

默认为1 这是因为ViewPager基于保存准备下一页的概念加载。 ViewPager不能存在不存在的页面。

感谢Tech Code Geek

答案 1 :(得分:0)

这就是ViewPager设计工作的方式。默认情况下,ViewPager仅创建当前页面以及当前页面左侧和右侧的屏幕外页面。这是为了允许页面之间的平滑过渡。

您还可以在空闲状态下设置视图层次结构中当前页面任一侧应保留的页数。

Read More

答案 2 :(得分:0)

这是视图寻呼机的默认和预期行为,它创建了左右各个片段以及用于平滑动画的可见片段,您无法限制片段的创建,可能是您可以做的是限制加载使用setuserVisibleHint()方法

对不可见片段进行内容处理
@Override
public void setUserVisibleHint(boolean visible){
   if(visible){
       //load content
    }
}