【问题标题】:Which lifecycle callback is called when a fragment pager adapter's fragment comes to screen?当片段寻呼适配器的片段出现在屏幕上时,调用哪个生命周期回调?
【发布时间】:2015-01-15 12:44:56
【问题描述】:

我想检测我使用 ViewPager 设置的三个片段中的特定片段何时出现在屏幕上。我在 viewpager 中有 3 个片段,并设置了 viewpager

mViewPager.setOffscreenPageLimit(2);

所以所有三个片段都是一次构建的(因为它在每侧存储 2 个)。我检查了 Fragment.onResume() 只被调用一次,而不是在每个片段进入前台时调用。是否有另一个回调来确保我可以捕获此事件并为其发送一些分析信号?

谢谢

【问题讨论】:

    标签: android-fragments android-viewpager android-listfragment android-lifecycle viewpagerindicator


    【解决方案1】:

    您可以使用ViewPager.setOnPageChangeListener() 设置ViewPager.OnPageChangeListener()

    根据其在 PagerAdapter 中的位置使用所选页面的侦听器。

    这是我的示例应用:

    package net.ynotapps.testviewpagerfragment;
    
    import android.support.annotation.Nullable;
    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.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import butterknife.ButterKnife;
    import butterknife.InjectView;
    
    
    public class MainActivity extends ActionBarActivity {
    
    
        @InjectView(R.id.pager)
        ViewPager pager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ButterKnife.inject(this);
    
            CustomPagerAdapter adapter = new CustomPagerAdapter(getSupportFragmentManager());
            pager.setAdapter(adapter);
            pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
                }
    
                @Override
                public void onPageSelected(int position) {
    
                    // Put Code here //
    
                    // Example code //
                    if (position == 2) {
                        Toast.makeText(MainActivity.this, "Found Position 2 fragment", Toast.LENGTH_SHORT).show();
                    }
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {
    
                }
            });
        }
    
    
        public static class CustomPagerAdapter extends FragmentPagerAdapter {
    
            public CustomPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public Fragment getItem(int position) {
                CustomFragment fragment = new CustomFragment();
                Bundle bundle = new Bundle();
                bundle.putString("display_text", String.format("Fragment %d is here.", position));
                fragment.setArguments(bundle);
                return fragment;
            }
    
            @Override
            public int getCount() {
                return 5;
            }
        }
    
        public static class CustomFragment extends Fragment {
    
            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
                TextView tv = new TextView(getActivity());
                tv.setText(getArguments().getString("display_text"));
                return tv;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      ViewPager 源码:

      // Dispatch the change to any listeners
              if (mAdapterChangeListeners != null && !mAdapterChangeListeners.isEmpty()) {
                  for (int i = 0, count = mAdapterChangeListeners.size(); i < count; i++) {
                      mAdapterChangeListeners.get(i).onAdapterChanged(this, oldAdapter, adapter);
                  }
              }
      

      所以,您可以使用ViewPager.addOnAdapterChangeListener 来监听回调。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        • 2014-07-06
        • 2012-11-21
        • 1970-01-01
        • 1970-01-01
        • 2013-08-24
        相关资源
        最近更新 更多