底部导航与Fragment联动的实现
2016-04-26 20:12
387 查看
今天我要写的是常见的如微信一类的底部导航与Fragment联动的实现
1,首先,在每一个Fragment里写一个public权限的TAG,保证每个Fragment的TAG唯一。
2,在xml里先好布局:
上半部分是你要放Fragment的地方,下半部分是底部导航放置的地方。下面是我的示例代码:
3,下面是MainActivity的示例代码:
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(); } }
相关文章推荐
- 指针中那些容易被忽视的小事
- 表格的高级应用
- Android中Touch事件的总结
- 深入解析代码重构
- @SuppressLint("NewApi")和@TargetApi()的区别
- Scrum 之 敏捷估算
- 线程
- 解决Android帧动画在Oncreate中启动只显示第一帧
- Tricks(四十四)—— 双层循环变为单层索引
- 团队作业---软件制作6
- 如何打印一个变量指定部分的字符
- c++平台判断
- Nexus私服详细配置----学习笔记
- 剑指offer(30):数组中出现次数超过一半的数字
- 作业六:团队
- 谷角猜想
- View requires API level 14 (current min is 8)
- 解决Dex超出方法数的限制问题,让你的应用不再爆棚
- java设计模式之装饰模式
- Container With Most Water (容器中盛最多的水)