Android开发实现底部导航栏+ViewPager滑动切换(记录一下)
底部导航栏两种方式做,OK,没啥问题;ViewPager,页面滑动切换组件,主要是要实现自定义的MyPagerAdapter继承于PagerAdapter,并且重写相应的方法即可。这个也没啥问题,忘记的话,看一下之前的博文:https://blog.****.net/lpcrazyboy/article/details/80772216
这次实现的底部导航栏+ViewPager滑动切换效果,用到了Fragment(片段),所以这次MyPagerAdapter继承自FragmentPagerAdapter。然后重写其中的getItem()方法,返回值是一个Fragment对象。(很好用吧)
先上效果图:
布局样式就不贴了,查看之前的关于底部导航栏的博文即可。
1、MyFragmentPagerAdapter.java的代码如下:
package com.deepreality.fragmentcasethreedemo; import android.support.v4.app.FragmentManager; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.view.ViewGroup; public class MyFragmentPagerAdapter extends FragmentPagerAdapter { private final int PAGER_COUNT = 4; private MyFragmentOne myFragment1 = null; private MyFragmentTwo myFragment2 = null; private MyFragmentThree myFragment3 = null; private MyFragmentFour myFragment4 = null; public MyFragmentPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); myFragment1 = new MyFragmentOne(); myFragment2 = new MyFragmentTwo(); myFragment3 = new MyFragmentThree(); myFragment4 = new MyFragmentFour(); } @Override public int getCount() { return PAGER_COUNT; } @Override public Object instantiateItem(ViewGroup container, int position) { return super.instantiateItem(container, position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); } @Override public Fragment getItem(int position) { Fragment fragment = null; switch (position) { case MainActivity.PAGE_ONE: fragment = myFragment1; break; case MainActivity.PAGE_TWO: fragment = myFragment2; break; case MainActivity.PAGE_THREE: fragment = myFragment3; break; case MainActivity.PAGE_FOUR: fragment = myFragment4; break; } return fragment; } }
其中,每一个Fragment界面,MyFragmentOne.java的代码如下:
package com.deepreality.fragmentcasethreedemo; import android.support.v4.app.Fragment; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class MyFragmentOne extends Fragment { private Context mContext; private TextView tvFragmentTitle; public MyFragmentOne() { } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fg_my, container, false); tvFragmentTitle = view.findViewById(R.id.my_tvFragmentTitle); tvFragmentTitle.setText("第一个Fragment!"); return view; } }
剩下的就是MainActivity.java的代码如下:
package com.deepreality.fragmentcasethreedemo; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.RelativeLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener, ViewPager.OnPageChangeListener { //几个代表页面的常量 public static final int PAGE_ONE = 0; public static final int PAGE_TWO = 1; public static final int PAGE_THREE = 2; public static final int PAGE_FOUR = 3; private RelativeLayout rLayoutTabMenuChannel, rLayoutTabMenuMessage, rLayoutTabMenuBetter, rLayoutTabMenuMy; private ViewPager vPagerNavigation; private TextView tvTabMenuChannel, tvTabMenuChannelNum, tvTabMenuMessage, tvTabMenuMessageNum, tvTabMenuBetter, tvTabMenuBetterNum, tvTabMenuMy, tvTabMenuMyNum; private MyFragmentPagerAdapter myFragmentPagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //因为是用的V4的ViewPager myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); bindView(); tvTabMenuChannel.setSelected(true); } private void bindView() { rLayoutTabMenuChannel = findViewById(R.id.main_rLayoutTabMenuItemChannel); rLayoutTabMenuMessage = findViewById(R.id.main_rLayoutTabMenuItemMessage); rLayoutTabMenuBetter = findViewById(R.id.main_rLayoutTabMenuItemBetter); rLayoutTabMenuMy = findViewById(R.id.main_rLayoutTabMenuItemMy); tvTabMenuChannel = findViewById(R.id.main_tvTabMenuItemChannel); tvTabMenuChannelNum = findViewById(R.id.main_tvTabMenuItemChannelNum); tvTabMenuMessage = findViewById(R.id.main_tvTabMenuItemMessage); tvTabMenuMessageNum = findViewById(R.id.main_tvTabMenuItemMessageNum); tvTabMenuBetter = findViewById(R.id.main_tvTabMenuItemBetter); tvTabMenuBetterNum = findViewById(R.id.main_tvTabMenuItemBetterNum); tvTabMenuMy = findViewById(R.id.main_tvTabMenuItemMy); tvTabMenuMyNum = findViewById(R.id.main_tvTabMenuItemMyNum); vPagerNavigation = findViewById(R.id.main_vPagerNavigation); vPagerNavigation.setAdapter(myFragmentPagerAdapter); //设置当前页的ID vPagerNavigation.setCurrentItem(0); //添加翻页监听事件 vPagerNavigation.addOnPageChangeListener(this); rLayoutTabMenuChannel.setOnClickListener(this); rLayoutTabMenuMessage.setOnClickListener(this); rLayoutTabMenuBetter.setOnClickListener(this); rLayoutTabMenuMy.setOnClickListener(this); } private void resetSelected() { tvTabMenuChannel.setSelected(false); tvTabMenuMessage.setSelected(false); tvTabMenuBetter.setSelected(false); tvTabMenuMy.setSelected(false); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.main_rLayoutTabMenuItemChannel:{ resetSelected(); tvTabMenuChannel.setSelected(true); vPagerNavigation.setCurrentItem(PAGE_ONE); break; } case R.id.main_rLayoutTabMenuItemMessage:{ resetSelected(); tvTabMenuMessage.setSelected(true); vPagerNavigation.setCurrentItem(PAGE_TWO); break; } case R.id.main_rLayoutTabMenuItemBetter:{ resetSelected(); tvTabMenuBetter.setSelected(true); vPagerNavigation.setCurrentItem(PAGE_THREE); break; } case R.id.main_rLayoutTabMenuItemMy:{ resetSelected(); tvTabMenuMy.setSelected(true); vPagerNavigation.setCurrentItem(PAGE_FOUR); break; } default:break; } } //重写ViewPager页面切换的处理方法 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { //state的状态有三个,0表示什么都没做,1正在滑动,2滑动完毕 if (state == 2) { switch (vPagerNavigation.getCurrentItem()) { case PAGE_ONE:{ resetSelected(); tvTabMenuChannel.setSelected(true); break; } case PAGE_TWO:{ resetSelected(); tvTabMenuMessage.setSelected(true); break; } case PAGE_THREE:{ resetSelected(); tvTabMenuBetter.setSelected(true); break; } case PAGE_FOUR:{ resetSelected(); tvTabMenuMy.setSelected(true); break; } } } } }完整Demo地址:https://download.****.net/download/lpcrazyboy/10515883