【问题标题】:SectionsPageAdapter with FragmentPageAdapterSectionsPagerAdapter 和 FragmentPagerAdapter
【发布时间】:2017-09-08 02:04:46
【问题描述】:

首先让我尝试重现我的问题/问题。

我的活动是一个带有 3 个选项卡的 TabbedActivity,由一个 SectionPageAdapter 和一个 FragmentPageAdapter 完成。

用户在这 3 个选项卡上输入数据。只需滑动用户就可以更改选项卡。用户填写完所有数据后,他必须点击一个 FloatingActionButton 来保存数据。

现在有我的问题,我不知道我是否可以使用填充的数据访问这 3 个片段? 我可以使用填充的数据加载所有 3 个片段,读取数据并保存它,还是我必须在更改页面之前处理 PageChangeListenEvent 并保存数据?

代码:

 public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        return TravelInfoActivity.PlaceholderFragment.newInstance(position + 1);
    }

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

}


 public static class PlaceholderFragment extends Fragment {

    private static final String ARG_FRAGMENT_ID = "fragment_id";
    private static int REQUEST_CODE_PLACE = 1;
    private View currentRootView;
    private View currentClickedView;

    @SuppressLint("UseSparseArrays")
    private HashMap<Integer, View> hMap = new HashMap<>();


    public PlaceholderFragment() {
    }

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static TravelInfoActivity.PlaceholderFragment newInstance(int sectionNumber) {
        TravelInfoActivity.PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        int fragmentLayout;
        switch (sectionNumber) {
            case 1:
                fragmentLayout = R.layout.fragment_accommodation;
                break;
            case 2:
                fragmentLayout = R.layout.fragment_visited_places;
                break;
            case 3:
                fragmentLayout = R.layout.fragment_additional_info;
                break;
            default:
                fragmentLayout = R.layout.fragment_accommodation;
        }
        args.putInt(ARG_FRAGMENT_ID, fragmentLayout);
        fragment.setArguments(args);
        return fragment;
    }
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final View rootView = inflater.inflate(getArguments().getInt(ARG_FRAGMENT_ID), container, false);
        currentRootView = rootView;
        switch (getArguments().getInt(ARG_FRAGMENT_ID)) {
            // switch handling here, not relevant
         }
 return rootView;
    }

【问题讨论】:

    标签: android android-fragments android-activity android-fragmentactivity android-tabbed-activity


    【解决方案1】:

    伙计们,我做到了让我的大脑焕然一新;)

    只需将 Fragment 中的实例保存到数组中,以后就可以使用它。 我在 SectionPageAdapter 中制作了这个并覆盖了方法 instantiateItem()

    public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
    
        private SparseArray<Fragment> registeredFragments = new SparseArray<>();
    
        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            Integer fragmentId = fragment.getArguments().getInt("fragment_id");
            registeredFragments.put(fragmentToPageMap.get(fragmentId), fragment);
    
            return  fragment;
        }
    
        public Fragment getRegisteredFragment(int position) {
            return registeredFragments.get(position);
        }
    
        public boolean registeredFragmentExists(int position) {
            if(registeredFragments.size() >= position) {
                if(registeredFragments.get(position) != null) {
                    return true;
                }
            }
            return false;
        }
    
    
        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).
           return TravelInfoActivity.PlaceholderFragment.newInstance(position);
        }
    
        @Override
        public int getCount() {
            return maxTabs;
        }
    
    }
    

    稍后您可以访问片段 roo​​tView

    mSectionsPagerAdapter.getRegisteredFragment(position);
    fragment.getActivity().findViewById(id);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2013-09-15
      • 1970-01-01
      • 2012-06-21
      相关资源
      最近更新 更多