我有一个包含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>
您可以看到它与他们网站上的完全不同。怎么会这样?我想澄清一下,因为作为一个初学者,我感到迷失在这片信息之海中。我应该使用哪种方法才能具有代表不同片段的滑动选项卡?
答案 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试图节省内存