前言
开发一个常规的app时,常规的界面设计:底部的导航栏,导航栏内添加不同页面的切换按钮.
虽然页面很简单,对于新手还是有些难度的,对fragment的生命周期和fragment的切换都需要一定的理解.
本篇文章是本人自己第一个项目的一些经验.
组件选择
我选择的组件是Radiogroup+fragment.我使用了一个SparseArray的数组来存放fragment. 这样就可以避免写switch语句.
mFragmentSparesArry=new SparseArray<>();
mFragmentSparesArry.append(R.id.index_tab,IndexFragment.newInstance("体检"));
mFragmentSparesArry.append(R.id.record_tab,settingFragment.newInstance("记录"));
mFragmentSparesArry.append(R.id.contact_tab,contactFragment.newInstance("导航"));
mFragmentSparesArry.append(R.id.settings_tab,healthFragment.newInstance("设置"));
为什么是这么写,我也不清楚,但是newInstance()这个创建实例的方法是fragment自带的方法.我就直接调用这个方法,然后以键值对的形式存在数组中.
动态切换
首先来fragment的切换,选择的是动态的切换,一开始是使用的fragment的replace切换,发现每次切换都会生成一个新的实例,不满足项目的要求.所以去寻找了一些现有的切换方案.在打捞的推荐下,我选择了动态切换.
代码如下:
private FragmentTransaction switchFragment(Fragment targetFragment)
{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if(!targetFragment.isAdded())
{
//第一次使用switchFragment()时currentFragement为null,
Log.e("Peter","!targetFragment.isAdded()");
if(currentFragment!=null)
{
transaction.hide(currentFragment);
}
transaction.add(R.id.fragment_container,targetFragment,currentFragment.getClass().getName());
}
else
{
Log.e("Peter","else");
transaction.hide(currentFragment)
.show(targetFragment);
}
currentFragment=targetFragment;
return transaction;
}
简单的说一下逻辑,主要涉及到fragment的两个操作,hide和add操作.
当监视器监测到点击事件后,判断目标页面是否添加过,如果没有,继续执行判断操作,判断当前页面是否为空,不为空,隐藏当前界面.隐藏当前界面之后,需要添加目标界面到容器中.如果目标页面被添加过了,隐藏当前界面,展示目标界面.最后一步尤为关键,以上操作过后,目标界面成为了当前界面.
是有点绕的一番说辞,所以画了一个流程图,便于理解
自定义导航栏默认显示界面
这里需要注意,不是调用系统的SupportFragmentMannager的方法,而是直接使用上面写的动态切换方法
switchFragment(mFragmentSparesArry.get(R.id.index_tab)).commit();