我利用fragment+ViewPager实现了底部导航栏功能,MainActivity布局是上面一个ViewPager,下面一个BottomNavigationView
我是参考https://blog.csdn.net/MrsZhang1995/article/details/111658786 做的底部导航栏
fragment是直接右击项目包-->New-->Fragment-->Fragment(Blank)创建的,四个fragment各有一个布局文件,所以我的fragment应该没有id。
现在我想从其他Activity点击按钮跳转MainActivity的第三个fragment,应该怎么写?
我的想法是跳转时给intent传一个int型值,0-3代表想跳转第0-3个fragment,但是不知道MainActivity怎么改
其他Activity设置跳转的代码:
Intent intent = new Intent(getBaseContext(), MainActivity.class);
intent.putExtra("id",3);
startActivity(intent);
MainActivity代码:不知道……处应该怎么写
public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener, ViewPager.OnPageChangeListener {
ViewPager viewPager;//用于展示不同的fragment
BottomNavigationView bottomNavigationView;//底部导航栏
HomeFragment homeFragment = new HomeFragment();//主界面
CommunityFragment communityFragment = new CommunityFragment();//社区
MallFragment mallFragment = new MallFragment();//商城
MineFragment mineFragment = new MineFragment();//我的
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();//初始化界面
int id = getIntent().getIntExtra("id",0);
switch(id) {
case 0://显示第0个fragment:HomeFragment
…………
break;
case 1://显示第1个fragment: CommunityFragment
…………
break;
case 2://显示第2个fragment:MallFragment
…………
break;
case 3://显示第3个fragment:MineFragment
…………
break;
}
}
private void init() {
//获取页面标签对象
viewPager = findViewById(R.id.viewPager);
viewPager.setOnPageChangeListener(this);//添加页面切换监视器
bottomNavigationView = findViewById(R.id.bottomNavigation);
bottomNavigationView.setOnNavigationItemSelectedListener(this);//添加导航栏选择监视器
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {//给页面添加适配器
@NonNull
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:return homeFragment;
case 1:return communityFragment;
case 2:return mallFragment;
case 3:return mineFragment;
}
return null;
}
@Override
public int getCount() {//界面个数
return 4;
}
});
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override
public void onPageSelected(int position) {
bottomNavigationView.getMenu().getItem(position).setChecked(true);
}
@Override
public void onPageScrollStateChanged(int state) { }
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
viewPager.setCurrentItem(item.getOrder());
return true;
}
}
viewPager.setCurrentItem(position);
FragmentViewPagerBottomNavigationActivity2.java
public class FragmentViewPagerBottomNavigationActivity2 extends AppCompatActivity {
private ViewPager mViewPager;
private List<Fragment> mFragments;
private MyViewPagerAdapterForFragment mMyViewPagerAdapter;
private BottomNavigationView mBottomNavigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_view_pager_bottom_navigation2);
initView();
initData();
initEvent();
}
private void initView() {
mViewPager = findViewById(R.id.vp);
mBottomNavigationView = findViewById(R.id.bnv);
}
private void initData() {
mFragments = new ArrayList<>();
// 承载多个栏目的主Fragment,把它单独用一个Fragment类来写,下文会对HomeFragment详述
mFragments.add(new HomeFragment());
// 这里是剩余两页:发现页面、我的页面
for (int i = 1; i < 3; i++) {
ExampleFragment fragment = ExampleFragment.newInstance("fragment" + i, "");
mFragments.add(fragment);
}
}
private void initEvent() {
mMyViewPagerAdapter = new MyViewPagerAdapterForFragment(getSupportFragmentManager(), mFragments);
mViewPager.setAdapter(mMyViewPagerAdapter);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
onPagerSelected(position);
Toast.makeText(FragmentViewPagerBottomNavigationActivity2.this, "当前第" + position + "页", Toast.LENGTH_SHORT).show();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
mBottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_home:
mViewPager.setCurrentItem(0);
return true;
case R.id.menu_find:
mViewPager.setCurrentItem(1);
return true;
case R.id.menu_mine:
mViewPager.setCurrentItem(2);
return true;
}
return false;
}
});
mBottomNavigationView.setSelectedItemId(R.id.menu_home);
}
private void onPagerSelected(int position) {
switch (position) {
case 0:
mBottomNavigationView.setSelectedItemId(R.id.menu_home);
break;
case 1:
mBottomNavigationView.setSelectedItemId(R.id.menu_find);
break;
case 2:
mBottomNavigationView.setSelectedItemId(R.id.menu_mine);
break;
}
}
}
与上节不同的点就是添加Fragment数据的部分。本节我们想要对首页的Fragment里面再添加多个子Fragment,因此就不能用ExampleFragment这个仅展示一个文本的Fragment了。我们的首页Fragment里面需要有多个页面切换,以及标题,需要新的布局,新的代码。接下来我们为它新建一个HomeFragment来具体实现。而另外两个页面Find和Mine,我们还用ExampleFragment做个简单模拟显示下文本就行了。
重写MainActivity的OnResume方法,在其中监听其他activity传递过来的Intent中"id"的值进行跳转等,记得判断是否存在这个值,不要直接用以免引起空指针异常
从上页面带过来一个值 对应viewpager的index