【问题标题】:android - Using same fragment class in ViewPagerandroid - 在 ViewPager 中使用相同的片段类
【发布时间】:2017-07-24 18:43:25
【问题描述】:

我有一个ViewPager,我想在每个页面中使用相同的Fragment,并使用不同的变量。但是当我这样做时,只有一页 ViewPager 正在查看,其他页面是空白的。我怎样才能做到这一点?我无法为每个选项卡创建不同的布局,因为我想动态添加它们。

ViewPagerAdapter:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

class FragmentStoreTabPageAdapter extends FragmentPagerAdapter {
    String[] pageTitles = {"Y","Z","X"};
    public FragmentStoreTabPageAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return FragmentStorePages.newInstance(pageTitles[position],position);
    }

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

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

包含 ViewPager 的主片段:

public class FragmentStore extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_store,container,false);
        ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager_store);
        viewPager.setAdapter(new FragmentStoreTabPageAdapter(getChildFragmentManager()));
        TabPageIndicator tpi = (TabPageIndicator) view.findViewById(R.id.indicator_store);
        tpi.setViewPager(viewPager);
        return view;
    }

}

ViewPager 中使用的 Fragment:

public class FragmentStorePages extends Fragment implements ReplaceListener {
    String categoryName;
    int categoryId;
    public static FragmentStorePages newInstance(String categoryName, int categoryId){
        FragmentStorePages fsp = new FragmentStorePages();
        Bundle args = new Bundle();
        args.putString("categoryName", categoryName);
        args.putInt("categoryId", categoryId);
        fsp.setArguments(args);
        return fsp;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_store_pages,container,false);
        Bundle args = getArguments();
        categoryName = args.getString("categoryName");
        categoryId = args.getInt("categoryId");
        getFragmentManager().beginTransaction().replace(R.id.fragment_store_pages,FragmentStoreSubCategories.newInstance(categoryName),"SubCategoryFragment").commit();
        return view;
    }

    @Override
    public void onReplace(Bundle args) {

    }
}

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

    使用这个PagerAdapter

    class FragmentStoreTabPageAdapter extends FragmentPagerAdapter {
        String[] pageTitles = {"Y","Z","X"};
        public FragmentStoreTabPageAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int position) {
            FragmentStorePages fsp = new FragmentStorePages();
            Bundle args = new Bundle();
            args.putString("categoryName", categoryName);
            args.putInt("categoryId", categoryId);
            fsp.setArguments(args);
            return fsp;
        }
    
        @Override
        public int getCount() {
            return 3;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return pageTitles[position];
        }
    }
    

    使用这个Fragment

    public class FragmentStorePages extends Fragment implements ReplaceListener {
        String categoryName;
        int categoryId;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_store_pages,container,false);
            Bundle args = getArguments();
            if(args!=null && args.containsString("categoryName")&& args.containsString("categoryId")){
            categoryName = args.getString("categoryName");
            categoryId = args.getInt("categoryId");
            }           
            return view;
        }
    
        @Override
        public void onReplace(Bundle args) {
    
        }
    }
    

    【讨论】:

    • 使用上面的代码并在 onCreateView() 中删除 getFragmentManager().beginTransaction().replace(R.id.fragment_store_pages,FragmentStoreSubCategories.newInstance(categoryName),"SubCategoryFragment").commit();
    • 虽然你的回答不是我的确切答案,但你给了我一个解决问题的想法。我必须使用 getChildFragmentManager()。编辑你的答案,我会接受。
    • 这里需要getChildFragmentManager()是什么,这个不需要。developer.android.com/training/animation/screen-slide.html
    • 我编辑了你的答案。我通过使用 getChildFragmentManager() 解决了这个问题。接受编辑,您的答案将被接受;)
    猜你喜欢
    • 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
    相关资源
    最近更新 更多