主界面:MainActivity

  1. package com.yongdaimi.android.androidapitest;
  2.  
  3. import android.os.Bundle;
  4.  
  5. import androidx.appcompat.app.AppCompatActivity;
  6.  
  7. import com.yongdaimi.android.androidapitest.fragment.HomePageFragment;
  8.  
  9. public class MainActivity extends AppCompatActivity {
  10.  
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15.  
  16. initFragment();
  17. }
  18.  
  19. private void initFragment() {
  20. HomePageFragment homePageFragment = HomePageFragment.newInstance();
  21. getSupportFragmentManager()
  22. .beginTransaction()
  23. .add(R.id.fl_main_container, homePageFragment, homePageFragment.getClass().getSimpleName())
  24. .commit();
  25. }
  26.  
  27. }

主界面布局:activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:id="@+id/fl_main_container"
  6. />

主界面入口的Fragment: HomePageFragment.java

  1. package com.yongdaimi.android.androidapitest.fragment;
  2.  
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.LayoutInflater;
  6. import android.view.MenuItem;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9.  
  10. import androidx.annotation.NonNull;
  11. import androidx.annotation.Nullable;
  12. import androidx.fragment.app.Fragment;
  13. import androidx.viewpager.widget.PagerAdapter;
  14. import androidx.viewpager.widget.ViewPager;
  15.  
  16. import com.google.android.material.bottomnavigation.BottomNavigationView;
  17. import com.google.android.material.bottomnavigation.LabelVisibilityMode;
  18. import com.yongdaimi.android.androidapitest.R;
  19.  
  20. import java.util.ArrayList;
  21. import java.util.List;
  22.  
  23. /**
  24. * A simple {@link Fragment} subclass.
  25. * Activities that contain this fragment must implement the
  26. * HomePageFragment.OnFragmentInteractionListener interface
  27. * to handle interaction events.
  28. * Use the {@link HomePageFragment#newInstance} factory method to
  29. * create an instance of this fragment.
  30. */
  31. public class HomePageFragment extends Fragment {
  32.  
  33. public static final String TAG = "xp.chen";
  34.  
  35. private View mContentView;
  36. private ViewPager vp_pager;
  37. private BottomNavigationView nv_bottom_menu;
  38.  
  39. private List<BaseViewController> mPageList;
  40.  
  41. public static HomePageFragment newInstance() {
  42. return new HomePageFragment();
  43. }
  44.  
  45. @Override
  46. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  47. Bundle savedInstanceState) {
  48. // Inflate the layout for this fragment
  49. mContentView = inflater.inflate(R.layout.fragment_home_page, container, false);
  50. return mContentView;
  51. }
  52.  
  53. @Override
  54. public void onActivityCreated(@Nullable Bundle savedInstanceState) {
  55. super.onActivityCreated(savedInstanceState);
  56. initView();
  57. initPages();
  58. setListener();
  59. }
  60.  
  61. private void initPages() {
  62. mPageList = new ArrayList<>();
  63. HomeViewController homeViewController = new HomeViewController(getActivity());
  64. mPageList.add(homeViewController);
  65.  
  66. ContactViewController contactViewController = new ContactViewController(getActivity());
  67. mPageList.add(contactViewController);
  68.  
  69. SearchViewController searchViewController = new SearchViewController(getActivity());
  70. mPageList.add(searchViewController);
  71.  
  72. SettingsViewController settingsViewController = new SettingsViewController(getActivity());
  73. mPageList.add(settingsViewController);
  74. vp_pager.setAdapter(mPagerAdapter);
  75. }
  76.  
  77. private void initView() {
  78. vp_pager = mContentView.findViewById(R.id.vp_pager);
  79.  
  80. nv_bottom_menu = mContentView.findViewById(R.id.nv_bottom_menu);
  81. nv_bottom_menu.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
  82. nv_bottom_menu.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
  83. }
  84.  
  85. private void setListener() {
  86. vp_pager.addOnPageChangeListener(mOnPageChangeListener);
  87. }
  88.  
  89. private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
  90.  
  91. @Override
  92. public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
  93. vp_pager.setCurrentItem(menuItem.getOrder());
  94. return true;
  95. }
  96. };
  97.  
  98. private PagerAdapter mPagerAdapter = new PagerAdapter() {
  99.  
  100. @Override
  101. public int getCount() {
  102. return mPageList.size();
  103. }
  104.  
  105. @Override
  106. public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
  107. return view == object;
  108. }
  109.  
  110. @NonNull
  111. @Override
  112. public Object instantiateItem(@NonNull ViewGroup container, int position) {
  113.  
  114. BaseViewController baseViewController = mPageList.get(position);
  115. ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
  116. container.addView(baseViewController, layoutParams);
  117. return baseViewController;
  118. }
  119.  
  120. @Override
  121. public void destroyItem(ViewGroup container, int position, Object object) {
  122. container.removeView((View) object);
  123. }
  124.  
  125. @Override
  126. public int getItemPosition(Object object) {
  127. return super.getItemPosition(object);
  128. }
  129.  
  130. @Override
  131. public void notifyDataSetChanged() {
  132. super.notifyDataSetChanged();
  133. }
  134.  
  135. };
  136.  
  137. private ViewPager.OnPageChangeListener mOnPageChangeListener = new ViewPager.OnPageChangeListener() {
  138. @Override
  139. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  140.  
  141. }
  142.  
  143. @Override
  144. public void onPageSelected(int position) {
  145. Log.i(TAG, "onPageSelected: " + position);
  146. nv_bottom_menu.getMenu().getItem(position).setChecked(true);
  147. }
  148.  
  149. @Override
  150. public void onPageScrollStateChanged(int state) {
  151.  
  152. }
  153. };
  154.  
  155. }

主界面入口Fragment的布局:fragment_home_page.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:app="http://schemas.android.com/apk/res-auto"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. >
  9.  
  10. <androidx.viewpager.widget.ViewPager
  11. android:id="@+id/vp_pager"
  12. android:layout_width="match_parent"
  13. android:layout_height="0dip"
  14. android:layout_weight="1"
  15. />
  16.  
  17. <com.google.android.material.bottomnavigation.BottomNavigationView
  18. android:id="@+id/nv_bottom_menu"
  19. android:layout_width="match_parent"
  20. android:layout_height="50dip"
  21. android:layout_gravity="bottom"
  22. android:background="?android:attr/windowBackground"
  23. app:menu="@menu/menu_navigation"
  24. app:elevation="4dip"
  25. />
  26.  
  27. </LinearLayout>

BottomNavigationView的menu文件:menu_navigation.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3.  
  4. <item
  5. android:id="@+id/item_tab1"
  6. android:icon="@drawable/ic_menu_home"
  7. android:title="Home"
  8. android:checked="true"
  9. android:orderInCategory="0"
  10. />
  11. <item
  12. android:id="@+id/item_tab2"
  13. android:icon="@drawable/ic_menu_contact"
  14. android:title="Contact"
  15. android:orderInCategory="1"
  16. />
  17. <item
  18. android:id="@+id/item_tab3"
  19. android:icon="@drawable/ic_menu_search"
  20. android:title="Search"
  21. android:orderInCategory="2"
  22. />
  23. <item
  24. android:id="@+id/item_tab4"
  25. android:icon="@drawable/ic_menu_settings"
  26. android:title="Settings"
  27. android:orderInCategory="3"
  28. />
  29.  
  30. </menu>

这里有几个地方需要特别说明一下:

1.  HomePageFragment.java 文件中的 nv_bottom_menu.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED); 用来设置BottomNavigationView在切换时的状态,如果不设置,在点击BottomNavigationView上的item在切换时文字可能会发生隐藏。
2. 上面menu文件中的 orderInCategory 属性用于设置菜单项的排列顺序,必须设置为大于或者等于0的整数值。数值小的排列在前,如果值相等,则按照XML中的顺序展现。 title 属性用于指定navigation Item的标题, icon 属性用于指定navigation item的图标。
3. fragment_home_page文件中的 app:elevation="4dip" 属性用于设置BottomNavigationView菜单顶部的模糊程度,如果不设置的话,BottomNavigationView的菜单顶部会很模糊。

最后是几个用于切换的Layout:

  1. package com.yongdaimi.android.androidapitest.fragment;
  2.  
  3. import android.content.Context;
  4. import android.widget.FrameLayout;
  5.  
  6. import androidx.annotation.NonNull;
  7.  
  8. public abstract class BaseViewController extends FrameLayout {
  9.  
  10. public BaseViewController(@NonNull Context context) {
  11. super(context);
  12. }
  13.  
  14. }

BaseViewController.java

  1. package com.yongdaimi.android.androidapitest.fragment;
  2.  
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5.  
  6. import androidx.annotation.NonNull;
  7.  
  8. import com.yongdaimi.android.androidapitest.R;
  9.  
  10. public class HomeViewController extends BaseViewController {
  11.  
  12. public HomeViewController(@NonNull Context context) {
  13. super(context);
  14. LayoutInflater.from(context).inflate(R.layout.layout_home, this);
  15. }
  16.  
  17. }

HomeViewController.java

  1. package com.yongdaimi.android.androidapitest.fragment;
  2.  
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5.  
  6. import androidx.annotation.NonNull;
  7.  
  8. import com.yongdaimi.android.androidapitest.R;
  9.  
  10. public class ContactViewController extends BaseViewController {
  11.  
  12. public ContactViewController(@NonNull Context context) {
  13. super(context);
  14. LayoutInflater.from(context).inflate(R.layout.layout_contact, this);
  15. }
  16.  
  17. }

ContactViewController.java

  1. package com.yongdaimi.android.androidapitest.fragment;
  2.  
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5.  
  6. import androidx.annotation.NonNull;
  7.  
  8. import com.yongdaimi.android.androidapitest.R;
  9.  
  10. public class SearchViewController extends BaseViewController {
  11.  
  12. public SearchViewController(@NonNull Context context) {
  13. super(context);
  14. LayoutInflater.from(context).inflate(R.layout.layout_search, this);
  15. }
  16.  
  17. }

SearchViewController.java

  1. package com.yongdaimi.android.androidapitest.fragment;
  2.  
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5.  
  6. import androidx.annotation.NonNull;
  7.  
  8. import com.yongdaimi.android.androidapitest.R;
  9.  
  10. public class SettingsViewController extends BaseViewController {
  11.  
  12. public SettingsViewController(@NonNull Context context) {
  13. super(context);
  14. LayoutInflater.from(context).inflate(R.layout.layout_settings, this);
  15. }
  16.  
  17. }

SettingsViewController.java

基本上都是一样的,它们的布局文件也很简单,就是一个布局里加一个TextView。

最终效果:

我这里的PageAdapter中并没有直接使用Fragment, 因为ViewPager在加载Fragment时,会同时初始化几个Fragment,这在实际开发中很不友好,目前正在想办法解决,这也是我什么只使用一个Fragment多个Layout的主要原因。如果希望ViewPager中添加的也是Fragment,可参考:

Android布局实现-BottomNavigationView+ViewPager+Fragment+整合

android: 结合BottomNavigationView、ViewPager和Fragment 实现左右滑动的效果的更多相关文章

  1. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

  2. ViewPager结合Fragment进行无限滑动

    实现ViewPager结合Fragment实现无限循环切换,这里也是在适配器里面进行的,当然使用滑动监听也能够实现 import android.support.v4.app.Fragment; im ...

  3. Android开发之ViewPager实现多页面切换及动画效果(仿Android的Launcher效果)

    Android开发中经常会有引导页或者切换页面等效果,本文采用ViewPager结合动画效果来实现仿Launcher以及页面切换的效果.源码地址在文章最后给出下载. 效果图如下:       1.Vi ...

  4. Android Tab -- 使用ViewPager、Fragment、FragmentPagerAdapter来实现

    原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换:点击标签切换. 代码:https://github.com/l ...

  5. 使用BottomNavigationView+ViewPager+Fragment的底部导航栏

    2019独角兽企业重金招聘Python工程师标准>>> 使用BottomNavigationView做底部工具栏,使用ViewPager做页面切换,使用Fragment完成每个页面的 ...

  6. 【Android 界面效果27】利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果

    本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...

  7. Android Tab类型主界面 Fragment+TabPageIndicator+ViewPager

    文章地址: Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager 1.使用ViewPager + PagerAdapter 每个页面的内容都 ...

  8. Android 利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果

    本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...

  9. Android -- ViewPager、Fragment、状态保存、通信

    工程架构                                                                                      TabAFm到Tab ...

随机推荐

  1. Maven项目命名规范

    Guide to naming conventions on groupId, artifactId and versiongroupId will identify your project uni ...

  2. MySQL Percona Toolkit--pt-osc执行SQL命令

    pt-osc执行日志 在对数据量为100000的表tb004做DROP COLUMN操作,pt-osc工具日志为: Operation, tries, wait: analyze_table, , c ...

  3. 04-JavaScript的操作

    本篇主要介绍获取元素的方法.操作元素.数组和字符串的操作方法.定时器和封闭函数.以及贪吃蛇案例: 一.获取元素的方法 1.document.getElementById:可以使用内置对象documen ...

  4. [LIN].LIN总线详解

    转自:https://www.2cto.com/kf/201806/754227.html 参考:https://wenku.baidu.com/view/a9b08d786bd97f192379e9 ...

  5. C#模拟鼠标、键盘操作

    C语言 在程序中打开网页,模拟鼠标点击.键盘输入 一.简述         记--使用C语言 打开指定网页,并模拟鼠标点击.键盘输入.实现半自动填写账号密码,并登录网站(当然现在的大部分网站都有验证码 ...

  6. ARTS-week7

    Algorithm 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. Two Sum 编写一个 SQL 查询,满足条件:无论 ...

  7. CodeForces - 76A:Gift (最小生成树 解决单调性问题是思想)

    题意:给定N点M边的无向连通图,每条边有两个权值(g,s). 给定G,S. 让你给出一组(g0,s0)使得图中仅留下g<=g0, s<=s0的边之后,依然连通,并求Gg0+Ss0的最小值. ...

  8. git version info & svn version info map(七)

    To generate the same version number as SVN, we can generate the same version number as SVN with the ...

  9. vigil rpm 包制作

    vigil 可以方便的进行服务的监控,以下尝试制作一个rpm 包,方便使用 安装依赖 ruby yum -y install ruby rubygems ruby-devel  修改gem 源 可选, ...

  10. snmp-get

    使用mibbroser可以连接到监控主机,可以获取主机mib信息 使用walk出的oid就可以获取到对应的值, 使用 -O fn 可以将返回的字符创形式的键改为数字型oid oid还有一种字符串的形式 ...