【问题标题】:how to use navigation drawer with tab viewer updating fragments如何使用带有标签查看器更新片段的导航抽屉
【发布时间】:2017-09-20 01:22:18
【问题描述】:

我用标签视图创建导航抽屉,没关系。但是,当我通过 ViewPager 在 tabView 上滑动项目时,函数 getItem 不会返回发生的情况。

我的活动:

    setupNavDrawer(4);

    FrameLayout contentFrameLayout = (FrameLayout) findViewById(R.id.container);

    getLayoutInflater().inflate(R.layout.activity_lte, contentFrameLayout);

    String[] titles = {"700Hz", "1800Hz", "2500Hz"};
    tabAdapter = new TabAdapter4(getSupportFragmentManager(), this,titles);
    mviewPager = (ViewPager) findViewById(R.id.vp);
    mviewPager.setAdapter(tabAdapter);

    getSupportActionBar().setElevation(0);
    tabAdapter = new TabAdapter4(getSupportFragmentManager(), this,titles);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mviewPager);

MyTabAdapter:

public TabAdapter4(FragmentManager fm, Context c, String[] titles) {
    super(fm);

    this.fm = fm;
    this.titles = titles;
    this.mContext = c;
}

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

    switch (position) {
        case 0:
            //frag = new Lte700Fragment();
            frag = Fragment.instantiate(mContext, Lte700Fragment.class.getName());
            break;
        case 1:
            //frag = new Lte18Fragment();
            frag = Fragment.instantiate(mContext, Lte18Fragment.class.getName());
            break;
        case 2:
            //frag = new Lte25Fragment();
            frag = Fragment.instantiate(mContext, Lte25Fragment.class.getName());
            break;
        default:

    }

    Bundle b = new Bundle();
    b.putInt("position", position);

    frag.setArguments(b);

    return frag;
}

@Override
public int getCount() {
    return 3;//titles.length;
}


@Override
public CharSequence getPageTitle(int position){
    return (titles[position]);
}

片段已更改,但 getItem 中的“位置”与实际不对应。当我是第一个片段时,位置返回 0 和 1,当我是第二个片段时返回 2,并且在第三个片段上不返回任何内容。

这对我的应用程序是有害的,因为我需要通过片段生命周期来控制 AsyncTask,因为当片段为 onPause 或 onResume 时线程会发生变化。

我的疑问是:当我使用 3 时,如何返回正确的位置来关闭,例如片段 1 和 2。

【问题讨论】:

标签: java android android-fragments


【解决方案1】:

您返回 Fragment 并设置位置为时已晚,因为 getItem 在任何给定的 ViewPager 更改中被多次调用,具体取决于当前页面和已加载的内容。

以下代码应设置位置参数,然后返回具有正确参数的片段。

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

    final Bundle b = new Bundle();
    b.putInt("position", position);

    switch (position) {
        case 0:
            frag = Fragment.instantiate(mContext, Lte700Fragment.class.getName());
            frag.setArguments(b);
            return frag;
        case 1:
            frag = Fragment.instantiate(mContext, Lte18Fragment.class.getName());
            frag.setArguments(b);
            return frag;
        case 2:
            frag = Fragment.instantiate(mContext, Lte25Fragment.class.getName());
            frag.setArguments(b);
            return frag;
        default:
            return null;
    } 
    // End the switch, end the method. 
}

可能看起来像重复代码,但实际发生的情况略有不同

【讨论】:

  • 我的答案是解决职位的正确方法。据我所知,没有办法绕过 Fragment 生命周期
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多