【问题标题】:Viewpager empty when opened second time第二次打开时Viewpager为空
【发布时间】:2020-01-14 09:14:53
【问题描述】:

我正在创建一个应用程序来创建销售订单。它有 1 个片段显示销售订单列表 (ListFragment),1 个片段显示销售订单的表单 (FormFragment),内部有一个 viewpager,它有 2 个片段:HeaderFragment 和 ItemsFragment。当我第一次访问它时,它工作正常,标题和项目正在显示输入字段。但是当我第二次访问它时,标题和项目都是空的。

这是我从 ListFragment 打开 FormFragment 的方法:

public class ListFragment extends Fragment {

    ListView listViewSO;
    Bundle bundle;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ((MainActivity)getActivity()).getSupportActionBar().setTitle("SO LIST");

        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_list_so, container, false);

        bundle = getArguments();

        listViewSO = root.findViewById(R.id.list_view_so);

        listViewSO.setOnItemClickListener(SOListItemClick);

        return root;

    }

    private AdapterView.OnItemClickListener SOListItemClick = new AdapterView.OnItemClickListener() 
    {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            SalesOrder salesOrder = (ListFragment.this).adapter.getItem(i);

            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            bundle.putParcelable("salesorder", salesOrder);

            FormFragment FormFragment = new FormFragment();
            FormFragment.setArguments(bundle);

            fragmentTransaction.replace(R.id.fragment_container, FormFragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    };
}

这是我的表单片段

public class FormFragment extends Fragment {
    Bundle bundle;
    SalesOrder salesorder;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ((MainActivity)getActivity()).getSupportActionBar().setTitle("EDIT SO");

        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_so_form, container, false);

       ((MainActivity)getActivity()).drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        ((MainActivity)getActivity()).toggle.setDrawerIndicatorEnabled(false);
        ((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        bundle = getArguments();
        salesorder = bundle.getParcelable("salesorder");

        viewPager = (ViewPager) root.findViewById(R.id.view_pager);
        setupViewPager(viewPager);

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

        return root;
    }

    private void setupViewPager(ViewPager viewPager) {
        SectionsPageAdapter adapter = new SectionsPageAdapter(getActivity().getSupportFragmentManager(), BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        adapter.addFragment(new HeaderFragment(), "Header");
        adapter.addFragment(new ItemFragment(), "Items");
        adapter.addBundle(bundle);
        viewPager.setAdapter(adapter);
    }
}

这是我的适配器:

public class SectionsPageAdapter extends FragmentPagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public SectionsPageAdapter(@NonNull FragmentManager fm, int behavior) {
        super(fm, behavior);
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    public void addBundle(Bundle bundle) {
        for(int i = 0; i < mFragmentList.size(); i++) {
            mFragmentList.get(i).setArguments(bundle);
        }
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }
}

最后,这是我的 HeaderFragment

public class VisitationSOHeaderFragment extends Fragment {

    Bundle bundle;
    SalesOrder salesorder;

    TextInputLayout textInputSoCode, textInputSoDate;
    ProgressBar loading;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_visitation_so_header, container, false);

        bundle = getArguments();
        salesorder = bundle.getParcelable("salesorder");

        loading = root.findViewById(R.id.loading);
        textInputSoCode = root.findViewById(R.id.text_input_so_code);
        textInputSoDate = root.findViewById(R.id.text_input_so_date);

        textInputSoCode.getEditText().setText(salesorder.getSoCode());
        textInputSoDate.getEditText().setText(salesorder.getSoDate());

        return root;
    }
}

它是怎么发生的? viewpager 设置有问题吗?任何帮助将不胜感激。

【问题讨论】:

    标签: android android-studio android-fragments android-viewpager


    【解决方案1】:

    不要使用getActivity().getSupportFragmentManager() 来获取FragmentPagerAdapter 的片段管理器。只需使用getChildFragmentManager 方法即可。

    【讨论】:

    • 有效!太感谢了!但我想知道为什么?你能解释一下吗?
    • ViewPager 片段是FormFragment 的子片段,但不是活动的。私有FragmentManager 实例应用于getChildFragmentManager 文档状态等情况。
    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多