Android--使用反射和FragmentTabHost实现底部导航

       本篇文章将继续总结实现底部导航的另外两种方式,RadioGroup+反射以及FragmentTabHost的形式实现底部导航,而其中反射是我在开发中最常用的一种方式,另外RadioGroup和Tablayout的方式实现底部导航在上一篇博客已经总结过,有需要使用另两种方式的可以看另一篇博客:

           博客地址:http://blog.csdn.net/huohao_blogs/article/details/72638319

一、使用RadioGroup+Fragment+反射实现底部导航

       ReflectActivity的资源文件(和第一种方式的内容是一样的,图片选择器和文字选择器参考另一篇博客):




    
    
        
        
        
        
    
然后进入ReflectActivity中:
public class ReflectActivity extends AppCompatActivity {

    private RadioGroup mRadioGroup;
    private FragmentManager mManager;
    private Fragment mCurrentFragment;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reflect);
        initView();
        initData();
        setListener();
    }

    private void setListener() {
        mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
                Classclazz=null;
                switch(checkedId){
                    case R.id.rb_reflect_homepage:
                        clazz= HomepageFragment.class;
                        break;
                    case R.id.rb_reflect_subscription:
                        clazz= SubscriptionFragment.class;
                        break;
                    case R.id.rb_reflect_find:
                        clazz= FindFragment.class;
                        break;
                    case R.id.rb_reflect_mine:
                        clazz= MineFragment.class;
                        break;
                }
                 showAndHide(R.id.fl_reflect_show,clazz);
            }
        });

    }
    private void initData() {
        mManager=getSupportFragmentManager();
        //设置默认显示的
        mRadioGroup.check(R.id.rb_reflect_homepage);
        showAndHide(R.id.fl_reflect_show,HomepageFragment.class);
    }

    private void showAndHide(int contentId,Classclazz) {
        //判断当前的fragment和需要替换的fragment是不是同一个
        if(mCurrentFragment!=null&&mCurrentFragment.getClass().getSimpleName().equals(clazz.getSimpleName())){
            return;
        }
        FragmentTransaction transaction=mManager.beginTransaction();
        Fragment fragment=null;
        //判断fragment有没有添加过
        try {
        Fragment  fragmentByTag=mManager.findFragmentByTag(clazz.getSimpleName());
        if(fragment!=null){
            //显示需要的fragment
            transaction.show(fragmentByTag);
            //隐藏当前的fragment
            transaction.hide(mCurrentFragment);
            //记录当前显示的fragment
            mCurrentFragment=fragmentByTag;
        }else{
            //通过无参的 公开的构造函数来创建fragment实例
            fragment=clazz.newInstance();  //需要try/catch声明异常
            //当前的fragment的没有添加过
            //把fragment添加到fragmentManager里面
            transaction.add(contentId,fragment,clazz.getSimpleName());
            //隐藏当前的fragment
            if(mCurrentFragment!=null){
                transaction.hide(mCurrentFragment);
            }
            //记录当前的fragment是哪个
            mCurrentFragment=fragment;
         }
         transaction.commit();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    private void initView() {
        ActionBar actionBar=getSupportActionBar();
        if(actionBar!=null){
            actionBar.hide();
        }
        mRadioGroup= (RadioGroup) findViewById(R.id.rg_reflect_navigation);
    }
}
实现的结果如下图所示:

   Android--使用反射和FragmentTabHost实现底部导航_第1张图片

二、使用FragmentTabHost实现底部导航

首先资源文件:


    
    
        
    
        
    


为tab添加的布局:


    
    
图片资源的选择器:


    
    
Textview的字体颜色选择器:



    
    

最后就是Activity中的代码:
public class TabHostActivity extends AppCompatActivity {

    private Class []mFragments;
    private ListmTitles;
    private FragmentTabHost mTabHost;
    private LayoutInflater mInflater;
    private  TextView mTextView;
    private ImageView mImageView;
    private View mView;
    private int [] mImageViews;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tab_host);
        initView();
        initData();
        setData();
    }
    private void setData() {
        //为FragmentTabHost来填充Fragment
          mTabHost.setup(this,getSupportFragmentManager(),R.id.fl_tabhost_show);
        for (int i = 0; i ();
        mTitles.add("首页");
        mTitles.add("订阅");
        mTitles.add("发现");
        mTitles.add("我的");
        mFragments=new Class[]{HomepageFragment.class,SubscriptionFragment.class,FindFragment.class,MineFragment.class};
        mImageViews=new int[]{R.drawable.hometablayout,R.drawable.subtablayout,R.drawable.findtablayout,R.drawable.minetablayout};
    }
    private void initView() {
         ActionBar actionBar=getSupportActionBar();
        if(actionBar!=null){
            actionBar.hide();
        }
         mTabHost= (FragmentTabHost) findViewById(R.id.fth_tabhost_nativation);
         mInflater=LayoutInflater.from(this);
    }
    private View getTabItemVIew(int index){
        mView=mInflater.inflate(R.layout.tab_indicator,null);
        mImageView= (ImageView) mView.findViewById(R.id.iv_tab_navigation);
        mImageView.setImageResource(mImageViews[index]);
        mTextView= (TextView) mView.findViewById(R.id.tv_tab_navigation);
        mTextView.setText(mTitles.get(index));
        return mView;
    }
}
最后实现的结果如下图:
 
     Android--使用反射和FragmentTabHost实现底部导航_第2张图片


       通过两篇博客总结了四种实现底部导航的方式,到这四种方式全部总结完毕。既是将自己用过的四种方式做一下总结,也是为需要的人提供一些帮助。

    源码地址:http://download.csdn.net/detail/huohao_blogs/9852863
    Github下载:https://github.com/huohaoliz/BottomNavigation











你可能感兴趣的:(Android开发)