首页 > 解决方案 > 在单击菜单项时使用 viewpager 运行新的片段实例

问题描述

我有一个基于 Android Studio 的“选项卡式活动”项目结构的工作片段代码。但是,由于我动态创建了填充空间的内容,因此标准滑动不适用,我想在从菜单中选择项目时在片段之间切换。

这是我的片段代码:

private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;

public static class PlaceholderFragment extends Fragment {

    private static final String ARG_SECTION_NUMBER = "section_number";

    public PlaceholderFragment() {
    }

    public static PlaceholderFragment newInstance(int sectionNumber)
    {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup containerPager,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, containerPager, false);
        TextView textView = (TextView) rootView.findViewById(R.id.temporary);
        textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
        return rootView;
    }
}

// FRAGMENT 1 - First. This one should have a blank layout!
public static class FragmentFirst extends Fragment {
    public static FragmentFirst newInstance(int sectionNumber) {
        FragmentFirst fragment = new FragmentFirst();
        return fragment;
    }

    public FragmentFirst() { }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup containerPager,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_first, containerPager, false);
        return rootView;
    }
}

// FRAGMENT 2 - Second
public static class FragmentSecond extends Fragment {
    public static FragmentSecond newInstance(int sectionNumber) {
        FragmentSecond fragment = new FragmentSecond();
        return fragment;
    }

    public FragmentSecond() { }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup containerPager,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, containerPager, false);
        return rootView;
    }
}

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @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).

        switch (position) {
            case 0:
                return FragmentFirst.newInstance(position + 1);
            case 1:
                return FragmentSecond.newInstance(position + 1);
            default:
                //assume you only have 2
                throw new IllegalArgumentException();
        }
    }

    @Override
    public int getCount() {
        // Show 2 total pages.
        return 2;
    }
}

创建时:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    ViewPager mViewPager = (ViewPager) findViewById(R.id.containerPager);
    mViewPager.setAdapter(mSectionsPagerAdapter);
}

此外,这里是选择特定菜单项的代码:

    @Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.change_fragment)
    {

        // Can I run/initiate the code at public Fragment getItem(int position) {} 
        // from here?

        // The lines below do work, but rather than running the fragments' code,
        // it simply overlaps with the current content.

        ViewPager mViewPager = (ViewPager) findViewById(R.id.containerPager);
        mViewPager.setCurrentItem(1, true);

        return true;
    }
    return super.onOptionsItemSelected(item);
}

但是,我熟悉mViewPager.setCurrentItem(position, true),而不是在当前布局上应用片段,我想触发片段代码,以便它可以在布局之间更改 - 在这种情况下,为fragment_mainFragmentSecond

问题:

public Fragment getItem(int position) {}是否可以在其类之外运行代码SectionsPagerAdapter extends FragmentPagerAdapter?还是有更好的方法来实现我正在寻找的东西?

标签: javaandroidandroid-studioandroid-fragmentsandroid-viewpager

解决方案


XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:background="@color/colorPrimary"
            app:tabGravity="fill"
            app:tabIndicatorColor="@color/black"
            app:tabMode="fixed"
            app:tabSelectedTextColor="@color/black"
            app:tabTextAppearance="@style/buttonThemePrimaryHolo1"
            app:tabTextColor="#fff" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/tabs">

        </android.support.v4.view.ViewPager>

    </RelativeLayout>
</android.support.design.widget.CoordinatorLayout>   

在活动中:

TabLayout tabLayout;
ViewPager viewPager;


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate ( savedInstanceState );
        setContentView ( R.layout.activity_main );

        viewPager = findViewById ( R.id.viewpager );
        setupViewPager ( viewPager );

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

}
private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter ( getSupportFragmentManager () );
        adapter.addFragment ( new Fragment1 (), "Fragment1 " );
        adapter.addFragment ( new Fragment2 (), "Fragment2 " );
        adapter.addFragment ( new Fragment3 (), "Fragment3 " );
        adapter.addFragment ( new Fragment4 (), "Fragment4 " );
        viewPager.setAdapter ( adapter );
}

class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List <Fragment> mFragmentList = new ArrayList <> ();
        private final List <String> mFragmentTitleList = new ArrayList <> ();

        public ViewPagerAdapter(FragmentManager manager) {
            super ( manager );
        }

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

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

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

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

在片段中

private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter ( getChildFragmentManager() );
        adapter.addFragment ( new Fragment1 (), "Fragment1 " );
        adapter.addFragment ( new Fragment2 (), "Fragment2 " );
        adapter.addFragment ( new Fragment3 (), "Fragment3 " );
        adapter.addFragment ( new Fragment4 (), "Fragment4 " );
        viewPager.setAdapter ( adapter );
}    

其他部分与片段中的活动相同


推荐阅读