您的位置:首页 > 其它

底部导航与Fragment联动的实现

2016-04-26 20:12 387 查看
今天我要写的是常见的如微信一类的底部导航与Fragment联动的实现

1,首先,在每一个Fragment里写一个public权限的TAG,保证每个Fragment的TAG唯一。

2,在xml里先好布局:

上半部分是你要放Fragment的地方,下半部分是底部导航放置的地方。下面是我的示例代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>

<FrameLayout
android:id="@+id/main_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">

</FrameLayout>

<RadioGroup
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@drawable/abc_ab_bottom_transparent_light_holo"
android:paddingTop="8dp"
android:orientation="horizontal">

<RadioButton
android:id="@+id/shouye_navigation"
style="@style/main_navigation"
android:text="@string/shouYe"
android:textColor="@drawable/navigation_text_select"
android:textSize="12sp"
android:checked="true"
android:drawableTop="@drawable/icon_shouye_select"
/>

<RadioButton
android:id="@+id/fenlei_navigation"
style="@style/main_navigation"
android:text="@string/fenLei"
android:textColor="@drawable/navigation_text_select"
android:textSize="12sp"
android:drawableTop="@drawable/icon_fenlei_select"
/>

<RadioButton
android:id="@+id/ruanzhuangmofa_navigation"
style="@style/main_navigation"
android:text="@string/ruanZhuangMoFa"
android:textColor="@drawable/navigation_text_select"
android:textSize="12sp"
android:drawableTop="@drawable/icon_ruanzhuangmofa_select"
/>

<RadioButton
android:id="@+id/gouwuche_navigation"
style="@style/main_navigation"
android:text="@string/gouWuChe"
android:textColor="@drawable/navigation_text_select"
android:textSize="12sp"
android:drawableTop="@drawable/icon_gouwuche_select"
/>

<RadioButton
android:id="@+id/wo_navigation"
style="@style/main_navigation"
android:text="@string/wo"
android:textColor="@drawable/navigation_text_select"
android:drawableTop="@drawable/icon_wo_select"
/>

</RadioGroup>

</LinearLayout>


3,下面是MainActivity的示例代码:

public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {

private RadioGroup controller;
//记录显示着的Fragment
private Fragment cacheFragment;

private FragmentManager fm;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initView();
}

private void initView() {
controller = ((RadioGroup) findViewById(R.id.controller));
controller.setOnCheckedChangeListener(this);

//获取一个FragmentManager实例
fm = getSupportFragmentManager();
//开启一个Fragment事物
FragmentTransaction transaction = fm.beginTransaction();
//事物中进行添加操作:
//①添加的位置,ContainerViewId
// ②Fragment,我们将要添加的碎片
//③String TAG,标记,为我们添加到Container中的Fragment添加标记.
cacheFragment = new PageOneFragment();
transaction.add(R.id.container, cacheFragment, PageOneFragment.TAG);
//提交事务
transaction.commit();
}

/**
* 当选中上网child改变的时候,就会回掉
* 不管child改变的来源,举个例子,由外界条件改变,造成RadioGroup中的子View改变
* 一个Button,控制选中状态改变,同样会回掉onCheckChange的方法。
* TODO:Fragment的hide,show
* ①将显示着的Fragment隐藏
* ②将要加载的Fragment显示出来
*
* @param group
* @param checkedId
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.controller_one:
/*//开启一个Fragment事物
FragmentTransaction transaction = fm.beginTransaction();
//隐藏显示着的Fragment
if (cacheFragment!=null){
transaction.hide(cacheFragment);
}
//加载要显示的Fragment
*//**
* ①根据TAG,去查找Fragment
* ②如果根据TAG成功找到Fragment,我们就将目标Fragment显示出来。
* ③如果根据TAG未找到Fragment,则会返回给我们一个null,我们就需要
*      实例化一个Fragment,显示出来,并记录下来
*//*
cacheFragment=fm.findFragmentByTag(PageOneFragment.TAG);
if (cacheFragment!=null){
transaction.show(cacheFragment);
}else{
cacheFragment=new PageOneFragment();
transaction.add(R.id.container,cacheFragment,PageOneFragment.TAG);
}
//提交事务
transaction.commit();*/
switchPage(PageOneFragment.TAG, PageOneFragment.class);
break;
case R.id.controller_two:
switchPage(PageTwoFragment.TAG, PageTwoFragment.class);
break;
case R.id.controller_three:
switchPage(PageTreeFragment.TAG, PageTreeFragment.class);
break;
case R.id.controller_four:
switchPage(PageFourFragment.TAG, PageFourFragment.class);
break;
}
}

private void switchPage(String tag, Class<? extends Fragment> cls) {
//开启一个Fragment事物
FragmentTransaction transactionFour = fm.beginTransaction();
//隐藏显示着的Fragment
if (cacheFragment != null) {
transactionFour.hide(cacheFragment);
}
//加载要显示的Fragment
/**
* ①根据TAG,去查找Fragment
* ②如果根据TAG成功找到Fragment,我们就将目标Fragment显示出来。
* ③如果根据TAG未找到Fragment,则会返回给我们一个null,我们就需要
*      实例化一个Fragment,显示出来,并记录下来
*/
cacheFragment = fm.findFragmentByTag(tag);
if (cacheFragment != null) {
transactionFour.show(cacheFragment);
} else {
try {
//通过反射,使用无参构造一个Fragment实例
cacheFragment = cls.getConstructor().newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
transactionFour.add(R.id.container, cacheFragment, tag);
}
//提交事务
transactionFour.commit();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: