【问题标题】:Why on calling first fragment second fragment is automatically getting called?为什么在调用第一个片段时第二个片段会自动被调用?
【发布时间】:2018-01-11 06:29:40
【问题描述】:

我正在使用 ViewPager 显示 4 个片段,但问题是在加载第一个片段时,第二个片段也被调用,即两个片段的 onActivityCreate() 方法被一起调用,并且在滑动到第二个片段时,第三个片段的 @987654322 @ 等其他片段和最后一个片段没有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;
    }


}

购买日期选择器

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 通常会创建类似这样的视图 previous-current-next。这是为了向左或向右平滑滑动。

标签: android android-fragments android-viewpager fragmentpageradapter


【解决方案1】:

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

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

是的,

mViewPager.setOffscreenPageLimit(int limit);

参数:limit - 空闲时将保留多少页面 状态。

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

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

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

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

感谢Tech Code Geek

【讨论】:

    【解决方案2】:

    ViewPager 就是这样设计的。默认情况下,ViewPager 只创建当前页面以及当前页面左侧和右侧的离屏页面。这是为了允许页面之间的平滑过渡。

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

    Read More

    【讨论】:

      【解决方案3】:

      这是视图分页器的默认和预期行为,它会在其左右创建每个片段以及可见片段以实现流畅的动画效果,您不能限制片段的创建,可能您可以做的是限制加载使用setuserVisibleHint() 方法的不可见片段上的内容

      @Override
      public void setUserVisibleHint(boolean visible){
         if(visible){
             //load content
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-23
        相关资源
        最近更新 更多