今天没事干,学习了一下App内部通用的底部导向栏如果使用
**1 首先我使用的是,android 28API, 其实早android 25之后就有这个控件了 BottomNavigationView,主要也就是学会如何使用这个控件,好了废话少说,上代码 **
主要代码就在ButtomBar.java里
package com.example.lisiwei.bottomnavigationviewdemo;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class ButtomBar extends AppCompatActivity {
private TextView mTextMessage;
private CustomViewPager mViewPager;
private MenuItem mMenuItem = null;
private List<Fragment> mFragments = new ArrayList<>();
private BottomNavigationView mNavigationView = null;
// 重写BottomNavigatinView中的OnNavigationItemSelectedListener监听,然后在onCreate中进行注册。
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
// 这里的item就是menu文件中的navigation的中的item控件。
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
mMenuItem = item;
switch (item.getItemId()) {
// 当点击到导向栏的第一个button是就会走ViewPager中对应的第一个view,下面的依次类推。
case R.id.navigation_first:
mViewPager.setCurrentItem(0);
return true;
case R.id.navigation_second:
mViewPager.setCurrentItem(1);
return true;
case R.id.navigation_third:
mViewPager.setCurrentItem(2);
return true;
case R.id.navigation_four:
mViewPager.setCurrentItem(3);
return true;
default:
return false;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_buttom_bar);
mNavigationView = findViewById(R.id.navigation);
mTextMessage = (TextView) findViewById(R.id.message);
mNavigationView = (BottomNavigationView) findViewById(R.id.navigation);
// 注册上面的接口实现
mNavigationView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
init();
}
private void init() {
// 这里的CustomViewPager是Viewpager的子类,主要在里面做了一件事就是开启或者禁止viewPager的滑动
mViewPager = (CustomViewPager) findViewById(R.id.viewpager);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public void onPageSelected(int i) {
// 这里面应该是选中Item之后,也就是进入到了当前的ViewPager里面做的一些事情。
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
// 将所有的viewPager子类都add到Fragment list中
mFragments.add(new FisrtFragment());
mFragments.add(new SecondFragment());
mFragments.add(new ThridFragment());
mFragments.add(new FourthFragment());
// 这个是将fragment list传给 viewPager的适配子类行进管理
BottomViewAdapter adapter = new BottomViewAdapter(getSupportFragmentManager(), mFragments);
mViewPager.setAdapter(adapter);
//表示当前View Item的左边和右边的View item处于被创建,其他的view item已经创建了,则被销毁,没有被创建也不会创建,为2依次类推
mViewPager.setOffscreenPageLimit(1);
// 这个是自己定义的一个接口开启或者禁止viewPager的滑动
mViewPager.setScanScroll(false);
}
}
2 Viewpager的子类 CustomViewPager.java自己定义了一个接口。是否需要滑动
package com.example.lisiwei.bottomnavigationviewdemo;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
public class CustomViewPager extends ViewPager {
private boolean isCanScroll = true;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 设置其是否能滑动换页
* @param isCanScroll false 不能换页, true 可以滑动换页
*/
public void setScanScroll(boolean isCanScroll) {
this.isCanScroll = isCanScroll;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return isCanScroll && super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return isCanScroll && super.onTouchEvent(ev);
}
}
3 FragmentPagerAdapter的子类 BottomViewAdapter.java 此类主要就是对ViewPager 中的View item进行管理
package com.example.lisiwei.bottomnavigationviewdemo;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
public class BottomViewAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragmentList;
public BottomViewAdapter(FragmentManager manager, List<Fragment> mFragmentList) {
super(manager);
this.mFragmentList = mFragmentList;
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
}
4 这个就是viewPager中加载的View item
package com.example.lisiwei.bottomnavigationviewdemo;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FisrtFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.firstfragment, container, false);
Log.d("lisiwei" ,"第一个fragment创建");
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("lisiwei" ,"第一个fragment销毁");
}
}
这里一共有4个继承自Fragment的View Pager加载类,其他的自己创建new 一下add到list 中就可以了。
如果又不懂的可以直接@我,大家一起共同学习
完整的代码下载路径:https://download.csdn.net/download/lisiwei1994/10851190