【问题标题】:Selected tab not being passed through to fragment in tablayout选定的选项卡未传递到选项卡布局中的片段
【发布时间】:2018-08-20 10:49:54
【问题描述】:

在一个简单的 tabLayout 视图 viewPager 设置中,我无法正确地将所选选项卡传递到其中的片段。当从左到右选择选项卡时(即选项卡 1 -> 选项卡 x),该选项卡被正确解释,但当它们从右到左选择时,返回 0。

这里是重要的代码:

Activity 包括 tabLayout:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);

    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
    viewPager.setAdapter(new OwnPagerAdapter(getSupportFragmentManager(), NavDrawer.this));

    tabLayout.setupWithViewPager(viewPager);

PagerAdapter:

public class OwnPagerAdapter extends FragmentPagerAdapter {
private int TAB_COUNT = 7;
private String tabTitles[] = new String[] {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
private Context context;

public OwnPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    this.context = context;

}

@Override
public Fragment getItem(int position) {
    return OwnTimetableFragment.newInstance(position - 1);
}

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

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

片段:

public class OwnTimetableFragment extends Fragment {

public static final String ARG_DAY = "ARG_DAY";

private int mDay;

public static OwnTimetableFragment newInstance(int day) {
    Bundle args = new Bundle();
    args.putInt(ARG_DAY, day);
    OwnTimetableFragment fragment = new OwnTimetableFragment();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mDay = getArguments().getInt(ARG_DAY);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View tabView = inflater.inflate(R.layout.fragment_own_timetable, container, false);
Log.e("mDay", mDay + "");
    return tabView;
}

片段的 onCreateView 中的 log 方法调用将正确返回数字 0->6,因为选项卡从左向右滑动,但是一旦选择了当前选项卡左侧的选项卡,它将返回 0,这将成为新的原点(即一个标签右侧将变为 1)

似乎有碎片进出焦点可能导致这种情况?

【问题讨论】:

  • 你作为 bundle ARG_DAY 传递到哪里?您的问题是您没有收到片段 ryt 中的ARG_DAY
  • ARG_DAY 通过 newInstance 函数传入 - 因为片段的 onCreate 中不能有参数。它传递给片段有时比根本没有收到它更成问题
  • 那么你的问题是什么?
  • 片段结束的那个值只是有时是正确的 - 如果我返回到之前打开的选项卡,数字不正确
  • 就在那里,第一种方法在低层代码sn-p中

标签: java android android-fragments android-viewpager android-tablayout


【解决方案1】:

首先,您在新实例中传递 pos - 1,因此,您的第一个选项卡将显示日志为 -1。如果你想要正确的值,只在 newInstance 中传递 pos。 除此之外,请确保您没有在 viewPager 中传递任何 setOffscreenPageLimit。您的代码中的其他所有内容似乎都还可以。 如果您仍然遇到问题,请告诉我您的确切问题。

【讨论】:

  • pos - 1 是从另一次尝试解决问题时遗留下来的,与问题本身无关。如果选择了当前选定选项卡右侧的选项卡,则该位置将增加一(正确行为)。如果选择了左侧的选项卡,无论是哪个选项卡,该位置都将返回 0
  • 您的代码在我的设备上运行正常。尝试使用任何其他设备。
  • 不幸的是,这个问题在物理设备 (gs8) 和模拟器上仍然存在
  • 您是否尝试过在适配器中的 getItem() 方法中添加日志..?如果你在那里得到正确的值,而片段中的值错误,那么你可能想尝试删除 newInstance 并手动加载片段。
  • 好主意,getItem() 方法中的值不正确,所以片段没有问题。我需要重写其他继承方法以传递正确的值吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多