使用viewpager的片段事务返回空白视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用viewpager的片段事务返回空白视图相关的知识,希望对你有一定的参考价值。

我正在使用带有视图寻呼机的tablayout来显示片段。我目前的设置是,我获得了“类别”的列表视图,用户点击了一个类别,然后返回一个新片段,其中包含该类别中可用折扣的列表。

我的设置创建了新的DiscountList片段,但在原始片段执行其事务时不会更新视图。有人可以帮我找出正确的解决方案吗?我不确定我的viewpager是不正确还是我错过了一步。如果需要,我可以提供更多信息。谢谢!

category list fragment.Java:

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_categories, container, false);

    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(container.getId(), DiscountListFragment.newInstance(position))
                    .addToBackStack(null)
                    .commit();
        }
    });

    return view;
}

discount list fragment.Java

public static DiscountListFragment newInstance(int categoryId) {
    DiscountListFragment discountListFragment = new DiscountListFragment();

    Bundle args = new Bundle();
    args.putInt("categoryId", categoryId);
    discountListFragment.setArguments(args);

    return discountListFragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        categoryId = getArguments().getInt("categoryId");
    }
    reactiveLocationProvider = new ReactiveLocationProvider(getActivity());
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_search_discount_list, container, false);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

view pager.Java

/**
 * Retrieves the selected tab and returns it. If new tab needs to be added
 * simply increment case and return a new fragment
 * @param position the position of tab selected
 * @return the selected tab
 */

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            return new HomeFragment();
        case 1:
            return new CategoryListFragment();
        case 2:
            return new MapViewFragment();
        case 3:
            return new MessagesFragment();
        default:
            return null;
    }
}

@Override
public int getCount() {
    return mNumOfTabs;
}
答案

替换ViewPager中的片段的最佳方法是创建加载到寻呼机中的根片段。根分片默认加载fragment1,稍后可以用fragment2替换。有人为此做了一个很好的例子并把它放在Github上:https://github.com/danilao/fragments-viewpager-example

我将采用与示例略有不同的方法,并让根片段负责切换片段,而不是子片段本身。但这是一个架构决策,取决于你。

另一答案

我认为你的transaction.replace()电话中的容器ID是错误的。如果CategoryListFragment是分页片段,那么container.getId()是ViewPager的id。你不希望这样。您想要包含带有ViewPager(一级)的片段的容器的id。

另一答案

我遇到了同样的问题,花了很多时间。我变了

mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());

mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); 

Viewpager片段。我得到了here的帮助

以上是关于使用viewpager的片段事务返回空白视图的主要内容,如果未能解决你的问题,请参考以下文章

如何用 ViewPager 中的另一个片段替换 Android 片段?

在片段中添加 Viewpager

从另一个片段返回时如何在视图页面中显示片段?

viewpager 中的片段,未找到视图错误

Fragment中的ViewPager,只有选项卡才能在第一个视图上加载选项卡

带有边距和页面转换器的片段内的 ViewPager 无法正确呈现