Android五分钟让你集成底部菜单栏(fragment或者fragment+viewpager)
来源:互联网 发布:ubuntu win10启动项 编辑:程序博客网 时间:2024/05/01 14:45
现在市场上大部分的App都有底部菜单栏,每个项目也都需要底部菜单栏的,而现在大部分底部菜单栏都是使用Fragment碎片来实现的,TabHost和TabActivity相比现在用的人非常少了吧!然而我们用fragment的话,使用过的人都应该知道还是有点麻烦的。每次显示fragment时,要显示点击的页卡fragment,要把显示的fragment隐藏,然后还要选中的底部textview变颜色,未选中的textview要变回默认的颜色,还是有点麻烦得。当然我这么说不是说明我们不需要这一步,只是相对来说集成非常简单了。还有fragment+viewpager的实现效果。废话不多说,效果图就不要看了,大家伙都知道的,直接上代码:
布局代码非常简单,把底部菜单的选项写成了一个自定义控件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/fragment_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </FrameLayout> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:background="@android:color/darker_gray" /> <include layout="@layout/layout_menu_bottom" /></LinearLayout>
layout_menu_bottom:
<com.example.android_xw_menu.view.MainBottomBar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/bottom_tab_bar" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center_vertical" android:orientation="horizontal" > <TextView style="@style/main_bar_item" android:drawableTop="@drawable/menu_item_home" android:text="微信" /> <TextView style="@style/main_bar_item" android:drawableTop="@drawable/menu_item_contacts" android:text="通讯录" /> <TextView style="@style/main_bar_item" android:drawableTop="@drawable/menu_item_find" android:text="发现" /> <TextView style="@style/main_bar_item" android:drawableTop="@drawable/menu_item_setting" android:text="设置" /></com.example.android_xw_menu.view.MainBottomBar>
我们的textview选中变色和图片选中变色都写成了Selector,这样我们在设置选中时,就直接把TextView.setSelected(true)就行了。
MainBottomBar代码,也是非常简单:
public class MainBottomBar extends LinearLayout implements OnClickListener { private CallBack mCallBack; public int prevIndex; public MainBottomBar(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override protected void onFinishInflate() { // TODO Auto-generated method stub super.onFinishInflate(); initAction(); } /** * 对每个子控件进行点击事件设置 */ private void initAction() { for (int i = 0, len = getChildCount(); i < len; i++) { getChildAt(i).setOnClickListener(this); } } @Override public void onClick(View v) { // TODO Auto-generated method stub View childView = null; if (!v.isSelected()) { for (int i = 0, len = getChildCount(); i < len; i++) { childView = getChildAt(i); if (v == childView) { // 当前view和点击的view相同时设置为选中,并回调mCallBack。 childView.setSelected(true); if (mCallBack != null) { mCallBack.call(prevIndex, i); } prevIndex = i; } else { childView.setSelected(false); } } } } /** * 给外部调用,设置点击哪个button * * @param index */ public void setSelected(int index) { if (index < getChildCount()) { getChildAt(index).performClick(); // 主动出发点击事件 prevIndex = index; } } public void setCallBack(CallBack mCallBack) { this.mCallBack = mCallBack; } /** * prevIndex:当前fragment下标 currentIndex:要切换到的fragment的下标 * * @author 巍 * */ public interface CallBack { public void call(int prevIndex, int currentIndex); }}
我们的底部菜单定义控件后,代码就是通用的了,然后通过回调的方式,进行切换fragment。非常方便,不要每个TextView都写一个点击事件,然后去监听,去还原。这样就非常简单,快捷了。
最后MainActivity:
public class FragmentMainActivity extends FragmentActivity { private MainBottomBar mMainBottomBar; private FragmentManager mFragmentManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_main); initMainButtom(); } private void initMainButtom() { mFragmentManager = getSupportFragmentManager(); mMainBottomBar = (MainBottomBar) findViewById(R.id.bottom_tab_bar); mMainBottomBar.setCallBack(new MainBottomBar.CallBack() { @Override public void call(int prevIndex, int currentIndex) { // TODO Auto-generated method stub // 获取当前fragment和切换到的fragment Fragment perFragment = mFragmentManager.findFragmentByTag("tag" + prevIndex); Fragment currentFragment = mFragmentManager.findFragmentByTag("tag" + currentIndex); FragmentTransaction ft = mFragmentManager.beginTransaction(); if (perFragment != null) { ft.hide(perFragment); } if (currentFragment == null) { currentFragment = getBottomTabFragment(currentIndex); ft.add(R.id.fragment_content, currentFragment, "tag" + currentIndex); } else { ft.show(currentFragment); } ft.commitAllowingStateLoss(); } }); mMainBottomBar.setSelected(0); } /** * 返回bottomTabFragment * * @param index * @return */ private Fragment getBottomTabFragment(int index) { Fragment mFragment = null; switch (index) { case 0: mFragment = new HomeFragment(); break; case 1: mFragment = new ContactsFragment(); break; case 2: mFragment = new FindFragment(); break; case 3: mFragment = new SettingFragment(); break; } return mFragment; }}
以上就是fragment底部菜单栏的全部代码,非常简单哦。既然有了fragment的切换,还有一些项目是可以进行滑动切换的,那么我们也引入viewpager+fragment的使用,用法也是非常简单,用到FragmentPagerAdapter这个适配器,同时,集成也也是非常简单和快速的。代码如下:
首先看Adapter:
public class FragmentPagerAdapter extends android.support.v4.app.FragmentPagerAdapter { private Class<?>[] fragmentClass; private Bundle[] mBundles; private int currentIndex; public FragmentPagerAdapter(FragmentManager fm, Class<?>[] fragmentClass) { super(fm); this.fragmentClass = fragmentClass; } public FragmentPagerAdapter(FragmentManager fm, Class<?>[] fragmentClass, Bundle[] mBundles) { super(fm); this.fragmentClass = fragmentClass; this.mBundles = mBundles; } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub try { Class<?> c = fragmentClass[arg0]; Fragment mFragment = (Fragment) (c.newInstance()); if (mBundles != null && arg0 < mBundles.length) { mFragment.setArguments(mBundles[arg0]); } return mFragment; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; } @Override public int getCount() { // TODO Auto-generated method stub return fragmentClass == null ? 0 : fragmentClass.length; } /** * 保存当前viewpager的下标 * * @param index */ public void saveCurrentIndex(int index) { currentIndex = index; } /** * 读取保存的viewpager的下标 * * @return */ public int getSaveCurrentIndex() { return currentIndex; }}
Activity:
public class FragmentViewPagerMainActivity extends FragmentActivity { private MainBottomBar mMainBottomBar; FragmentPagerAdapter fragmnetpageradapter; private ViewPager viewPager;// 页卡内容 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_viewpager_main); initViewPager(); } private void initViewPager() { viewPager = (ViewPager) findViewById(R.id.packpage_vPager); // new Class<?>[]{}用来传递fragment到adapter里面。 // new Bundle[]{}对应fragment,传递到fragment的数据。 fragmnetpageradapter = new FragmentPagerAdapter(getSupportFragmentManager(), new Class<?>[] { HomeFragment.class, ContactsFragment.class, FindFragment.class, SettingFragment.class, }, new Bundle[] {}); viewPager.setAdapter(fragmnetpageradapter); viewPager.setOnPageChangeListener(new MyOnPageChangeListener()); viewPager.setCurrentItem(0); mMainBottomBar = (MainBottomBar) findViewById(R.id.bottom_tab_bar); mMainBottomBar.setCallBack(new MainBottomBar.CallBack() { @Override public void call(int prevIndex, int currentIndex) { viewPager.setCurrentItem(currentIndex); } }); mMainBottomBar.setSelected(0); } /** * 当viewpager切换完成时 * * @author 巍 * */ public class MyOnPageChangeListener implements OnPageChangeListener { public void onPageScrollStateChanged(int position) { } public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageSelected(int arg0) { mMainBottomBar.setSelected(arg0); } }}
布局很简单,就是把FrameLayout换成viewpager就行了。大家伙应该可以看到其实fragment+viewpager的方式比单纯的fragment集成方式还要简单一些。以上就是fragment和fragment+viewpager简单的集成方式的全部内容了,如有错误之处,欢迎大家在下面评论留言,欢迎大神指导...
附上DEMO下载地址
- Android五分钟让你集成底部菜单栏(fragment或者fragment+viewpager)
- Android五分钟让你集成底部菜单栏(fragment或者fragment+viewpager)
- Android知识点九(ViewPager + Fragment 实现底部菜单栏)
- Android底部Tab菜单栏(FragmentTabHost+ViewPager+Fragment)
- Android使用fragment底部菜单栏
- Android 底部菜单栏RadioButton+Fragment
- 用Fragment+FragmentTabHost++ViewPager 实现底部菜单栏
- ViewPager+Fragment+AcitonBar整合 (可用于实现顶部或者底部菜单栏)
- Fragment实现底部菜单栏
- Fragment底部菜单栏
- Fragment实现底部菜单栏
- Fragment实现底部菜单栏
- Android TabHost +Fragment 实现底部菜单栏
- Android TabHost +Fragment 实现底部菜单栏 .
- 【Android】底部菜单栏--Fragment+FragmentTabHost实现
- #Android笔记#fragment+fragmentTabHost实现底部菜单栏
- 【Android UI】RadioGroup+Fragment实现底部菜单栏
- Android 使用Fragment实现底部菜单栏
- 修改view的x,y,width,height值的方法
- Unable to locate the model you have specified
- 从沙盒中取出被保存的图片
- 安卓页面点击跳转intent
- 详谈侧滑页面ViewPager的使用
- Android五分钟让你集成底部菜单栏(fragment或者fragment+viewpager)
- Android基础之intent-filter、action、category标签使用
- hdoj 3879 Base Station 【最小割 之 最大权闭合图】
- Android UI设计——ViewPage中自定义标题栏(四)
- shell脚本检测主机是否存活
- Sandbox Evasion with COM by Malware in-the-Wild
- 用序列之王splay解决线段树经典问题
- 2015多校联合第六场 hdu5360hiking
- kettle基本操作