【问题标题】:Swap Fragement in FragmentPagerAdapter在 FragmentPagerAdapter 中交换 Fragment
【发布时间】:2018-04-13 14:49:20
【问题描述】:

我已经为三个片段实现了默认片段寻呼机适配器。它工作正常,但我想要的是从这三个片段之一(不是来自活动)中交换片段。我已经尝试搜索ans,但找不到。

编辑: 我正在使用带滑块的 DEFAULT tablayout 活动。我没有使用自定义 fragmentPagerAdapter。下面的类在主要活动中实现。

public class SectionsPagerAdapter extends FragmentPagerAdapter { 
        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }
        @Override
        public Fragment getItem(int position) {
            switch (position){
                case 0:
                    return new FragmentTest1();
                case 1:
                    return new FragmentTest2();
                case 2:
                    return new FragmentTest3();
                default:
                    return null;
            }}
        @Override
        public int getCount() {
            return 3;
        }

主活动 主要活动的onCreate方法如下...

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_slider);    
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

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

    }

片段测试1 我想从 FragmentTest1 过渡到另一个片段。

public class FragmentTest1 extends android.support.v4.app.Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.tab_log, container, false);
        Button button = rootView.findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
        return rootView;
    }
}

我想将点击事件转换到另一个片段...

【问题讨论】:

    标签: android fragment fragmentpageradapter


    【解决方案1】:

    我有同样的实现,我有一个ViewPagerFragment,它使用ImageAdapter在片段之间交换,这是一个ImageFragment,所以基本上你需要一个适配器。

    ViewPagerFragment:

    public class ViewPagerFragment extends Fragment {
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_viewpager, container, false);
            ButterKnife.bind(this, view);
    
            mAdapter = new ImageAdapter(getChildFragmentManager(), yourObjects);
            mViewPager.setAdapter(mAdapter);
    
            return view;
    }
    

    图像适配器:

    public class ImageAdapter extends FragmentStatePagerAdapter {
    
        private ArrayList<YourObject> mYourObjects;
    
        public ImageAdapter(FragmentManager fm, ArrayList<YourObject> yourObjects) {
            super(fm);
            mYourObjects = yourObjects;
        }
    
        @Override
        public Fragment getItem(int position) {
            return new ImageFragment().newInstance(position, mYourObjects);
        }
    
        @Override
        public int getCount() {
            return mYourObjects.size();
        }
    }
    

    最后是 ImageFragment:

        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_image, container, false);
            ButterKnife.bind(this, view);
            mClickedImagePosition = getArguments().getInt(POSITION_KEY);
            mYourObject = getArguments().getParcelableArrayList(YOUR_OBJECT_KEY);
    
            // set your objects here
    
            return view;
        }
    
        public ImageFragment newInstance(int position, ArrayList<YourObject> yourObjects) {
            ImageFragment fragment = new ImageFragment();
            Bundle bundle = new Bundle();
            bundle.putInt(POSITION_KEY, position);
            bundle.putParcelableArrayList(YOUR_OBJECT_KEY, yourObjects);
            fragment.setArguments(bundle);
    
            return fragment;
        }
    

    我省略了一些样板代码,例如膨胀视图,但这会起作用。如果您有任何问题,请告诉我。

    【讨论】:

    • 谢谢,但我正在使用 tablayout 活动。我更新了我的问题。我也会试试你的答案。我没有太多时间,所以我在犹豫是否要重新实现 tablayout 活动。
    • @khan 你用viewpager tabLayout.setupWithViewPager(viewpager)设置你的tablayout了吗?
    • @khan 我认为您不必感到沮丧,我会尽力提供帮助,然后您必须提供更多代码,因为我会继续猜测,就像您使用适配器的 viewpager 片段和单页片段一样。
    • 非常感谢您的帮助,我一点也不沮丧。如果我听起来很沮丧,我很抱歉。我再次更新了我的问题。请看一下。再次感谢您的帮助...
    • @khan 不用担心 :) 我自己有点苛刻 :) 我相信在你的情况下,当你做 mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 你需要通过 getChildFragmentManager() 而不是 getSupportFragmentManager() 因为当你处理 viewpager 中的嵌套 Fragment,内部 Fragment 由 viewpager 而不是 Activity 管理。
    【解决方案2】:

    我不记得执行此操作的确切代码,但这是可能的! 如果你通过你的 Fragment 访问 Fragments 父级(应该是 Fragment Manager 吧?)然后告诉 Fragment Manager 切换到 Fragment x?..

    我记得不久前在一个应用程序中这样做过.. 它不漂亮,但它有效! (如果它有效,它并不愚蠢......或者是吗?)

    【讨论】:

    • 我试过了,但它不起作用。我附上了下面的代码...final FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.container, new AppList(), "Log"); ft.addToBackStack(null); ft.commit();
    【解决方案3】:

    在这种情况下,片段只能通过 viewpager(据我所知)访问,并且要使 viewpager 成为子片段,您必须在 MainActivity 中使 viewpager 成为静态。 public static ViewPager viewPager; 访问 viewPager ParentActivity.viewPager.arrowScroll(View.FOCUS_RIGHT); 执行动作 ParentActivity.viewPager.arrowScroll(View.FOCUS_LEFT);

    参考:
    https://stackoverflow.com/a/46707510/3481412

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多