这两种滑动标签的实现方式有何不同?

时间:2018-11-19 10:50:15

标签: android

我有一个包含3个标签的工作代码,其中包含3个片段,您可以水平滑动以更改它们,也可以单击该标签转到所需的片段。 但是,我想对设计进行一些调整,然后转到Android开发人员的网站:Creating swipe views with tabs ,它看起来和我的完全不同。现在,我想知道是否应该使用开发者网站中的代码,还是保留自己的代码。

现在我正在使用ViewPager + TabLayout。

如此简单,却可以正常工作。 这也让我感到奇怪,这个简单的代码是如何工作的,但是在官方文档中有很长的一段话。这只是让我认为,如果我将代码保留在当前设计中,将来可能会遇到一些大问题。 或者-如果有效-那么有效吗?

MainActivity.java:

public class MainActivity extends AppCompatActivity {

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

        // Find the view pager that will allow the user to swipe between fragments
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);

        // Create an adapter that knows which fragment should be shown on each page
        TabsAdapter adapter = new TabsAdapter(this, getSupportFragmentManager());

        // Set the adapter onto the view pager
        viewPager.setAdapter(adapter);

        // Find the tab layout that shows the tabs
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

        // Connect the tab layout with the view pager. This will
        //   1. Update the tab layout when the view pager is swiped
        //   2. Update the view pager when a tab is selected
        //   3. Set the tab layout's tab names with the view pager's adapter's titles
        //      by calling onPageTitle()
        tabLayout.setupWithViewPager(viewPager);

    }
}

TabsAdapter.java:

public class TabsAdapter extends FragmentPagerAdapter {

    /** Context of the app */
    private Context mContext;


    public TabsAdapter(Context context, FragmentManager fm) {
        super(fm);
        mContext = context;
    }

    /**
     * Return the {@link Fragment} that should be displayed for the given page number.
     */
    @Override
    public Fragment getItem(int position) {
        if (position == 0) {
            return new NbFragment();
        } else if (position == 1) {
            return new LksFragment();
        } else {
            return new ChtFragment();
        }
    }

    /**
     * Return the total number of pages.
     */
    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        if (position == 0) {
            return mContext.getString(R.string.category_nb);
        } else if (position == 1) {
            return mContext.getString(R.string.category_lks);
        } else {
            return mContext.getString(R.string.category_cht);
        }
    }

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/primary_color"
    android:orientation="vertical"
    tools:context="com.example.barebones.barebones.MainActivity">

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        style="@style/CategoryTab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

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

</LinearLayout>

您可以看到它与他们网站上的完全不同。怎么会这样?我想澄清一下,因为作为一个初学者,我感到迷失在这片信息之海中。我应该使用哪种方法才能具有代表不同片段的滑动选项卡?

1 个答案:

答案 0 :(得分:1)

我迷失了您要在此处解决的问题。您是否正在尝试这样做,以便在水平滑动或分别更改片段时也可以更新选项卡布局?如果是这样的话。我下面有一个摘要,您可能必须根据变量名进行调整。

protected void initializeNavigationTransition() {
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i1) {

        }

        @Override
        public void onPageSelected(int i) {
            tabs_bottom_nav.getTabAt(i).select();
        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });

    tabs_bottom_nav.addOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
            updateTabIconOnSelect(current_tab, tab.getPosition());
            current_tab = tab.getPosition();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

我还要额外说明一下,片段可能会刷新,这意味着它将被重新初始化,这可能是您不希望的,尤其是当您正在向这些片段显示数据时(从中获取数据)您的API或网络上,如果您在视图分页器中可能至少有4个片段,则将其滑动几次到不同的片段之后。因此,您需要通过使用以下代码来防止视图分页器刷新片段

    viewPager.setOffscreenPageLimit(4); // 4 is the number of fragments within your view pager
    viewPager.setAdapter(sectionsPagerAdapter);

我相信片段刷新的原因是由于viewpager试图节省内存