【问题标题】:Access instance of currently viewed fragment attached using viewpager使用 viewpager 附加的当前查看片段的访问实例
【发布时间】:2017-09-14 08:46:59
【问题描述】:

我已经使用 https://developer.android.com/training/animation/screen-slide.html 要么 https://developer.android.com/training/implementing-navigation/lateral.html

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/some_background_fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

    <android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</RelativeLayout>

这里是 MyActivity.java:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_overlay);

        // Instantiate a ViewPager and a PagerAdapter.
        mPager = findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
        mPager.setCurrentItem(1);
    }
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            if (position == 0)
                return new Page0Fragment();
            else
                return new Page1Fragment();
        }

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

现在我正在尝试像这样访问当前查看的片段

 public void myonclickmethod(View view) {
    FragmentManager fm = getSupportFragmentManager();       
    fragment = fm.findFragmentById(R.id.pager);//<=**This is coming as instance of Page0Fragment inspite of me intializing the activity with Page1Fragment and also currently standing on Page1Fragment without any swiping**
 }

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

    首先,您需要更改您的ScreenSlidePagerAdapter 以每次都返回相同的实例,而不是新的Page0Fragment,例如:

        private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{
                List<Fragment> fragments = new ArrayList<>();
                public ScreenSlidePagerAdapter(FragmentManager fm) {
                    super(fm);
                    fragments.add(new Page0Fragment());
                    fragments.add(new Page1Fragment());
                }
    
                @Override
                public Fragment getItem(int position) {
                    return fragments.get(position);
                }
    
                @Override
                public int getCount() {
                    return fragments.size();
                }
    

    现在要获取可见片段,请执行以下操作:

    public void myonclickmethod(View view) {
        int currentPosition = mPager.getCurrentItem();
        if(currentPosition == 0 {
            Page0Fragment page0Fragment = (Page0Fragment)mPagerAdapter.getItem(currentPosition);
            page0Fragment.doSomething();
        } else {
            Page1Fragment page1Fragment =(Page1Fragment)mPagerAdapter.getItem(currentPosition);
           pag1Fragment.doSomething();
    
     }
    

    【讨论】:

      【解决方案2】:

      您可以像这样使用适配器上的当前位置调用 getItem() 来获取当前片段

          public void myonclickmethod() {
             Fragment fragment = adapter.getItem(viewpager.getCurrentItem())
      }
      

      【讨论】:

      • 这是正确的,但是当适配器在 getItem() 方法中返回新的 Fragment() 时,调用此方法不会给出在 ViewPager 中膨胀的相同片段实例。因此从检索到的片段中调用任何方法将主要导致 NullPointerException。所以@OP 也改变了你的适配器。
      • @sam_0829 正是我必须纠正我的 getItem() 实现以缓存之前创建的实例以使其完全正常工作。
      猜你喜欢
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多