安卓实战简单新闻客户端2
注意,我们现在的主界面还是空的,不过我们在主界面里留下了一个FrameLayout布局,对于不同的切换就是在Fragment的切换,也就是Fragment的动态添加。
再看一次原作者的新闻界面:
很容易看出来是Viewpage加上TabLayout的应用,关于这个
我也写过相关文章: android-UI-viewpager--PagerTabStrip的使用---网易云探索(2)
也可以参考文章:ViewPager实现页卡的最新方法--简洁的TabLayout
Fragment布局文件:
fragment_news:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="@color/colorAccent"
app:tabSelectedTextColor="@color/colorPrimaryDark"
app:tabTextColor="#000"/>
<!--可滑动的布局内容-->
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
FragmentNews:
注意我们要做一个fragment里面嵌套fragment:先不嵌套
public class NewsFragment extends Fragment {
public static final int NEWS_TYPE_TOP = 0;
public static final int NEWS_TYPE_NBA = 1;
public static final int NEWS_TYPE_CARS = 2;
public static final int NEWS_TYPE_JOKES = 3;
private TabLayout mTablayout;
private ViewPager mViewPager;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news, null);
mTablayout = (TabLayout) view.findViewById(R.id.tab_layout);
mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
mViewPager.setOffscreenPageLimit(3);
setupViewPager(mViewPager);
mTablayout.addTab(mTablayout.newTab().setText(R.string.top));
mTablayout.addTab(mTablayout.newTab().setText(R.string.nba));
mTablayout.addTab(mTablayout.newTab().setText(R.string.cars));
mTablayout.addTab(mTablayout.newTab().setText(R.string.jokes));
mTablayout.setupWithViewPager(mViewPager);
return view;
}
private void setupViewPager(ViewPager mViewPager) {
//Fragment中嵌套使用Fragment一定要使用getChildFragmentManager(),否则会有问题
// MyPagerAdapter adapter = new MyPagerAdapter(getChildFragmentManager());
// adapter.addFragment(NewsListFragment.newInstance(NEWS_TYPE_TOP), getString(R.string.top));
// adapter.addFragment(NewsListFragment.newInstance(NEWS_TYPE_NBA), getString(R.string.nba));
// adapter.addFragment(NewsListFragment.newInstance(NEWS_TYPE_CARS), getString(R.string.cars));
// adapter.addFragment(NewsListFragment.newInstance(NEWS_TYPE_JOKES), getString(R.string.jokes));
// mViewPager.setAdapter(adapter);
}
public static class MyPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
public void addFragment(Fragment fragment, String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
}
监听按钮,动态添加fragment:
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
Toast.makeText(getApplicationContext(),
menuItem.getTitle(), Toast.LENGTH_LONG).show();
switch (menuItem.getItemId()){
case R.id.navigation_news:
getSupportFragmentManager().beginTransaction().replace(R.id.frame_content, new NewsFragment()).commit();
mToolbar.setTitle("新闻");
break;
default:
break;
}
menuItem.setChecked(true);
mDrawerLayout.closeDrawers();
return true;
}
测试: