栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

底部菜单栏FragmentTabHost的使用(学习记录)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

底部菜单栏FragmentTabHost的使用(学习记录)

1.布局文件的写法 

                        布局文件包括activity_main(主页界面),tab_indicator(每一个底部菜的布局),fragment_home,fragment_cart,fragment_hot,fragment_mine以及四个不同页面的布局

  activity_main布局文件十分简单,可以是一个简单的LinearLayout(线性布局)中添加FragmentTabHost控件即可。




    

    

        

    

     这里有两个FramLayout控件,其中用+id命名为realtabcontent的FramLayout控件为之后要用到的FramLayout,另一个FramLayout没有实际作用,仅仅只是FragmentTabHost控件的规定写法而已。

  tab_indicator的布局




    


    


   fragment_home,fragment_cart,fragment_hot,fragment_mine的简单布局文件,这四个文件只有显示文字不同以作标示。此处只展示fragment_mine的源码。



    


 2.主要代码

  布局好FragmentTabHost控件后,在mainActivity中获取该控件并调用它的setup()方法,setup方法需要传入三个参数,例如:

mTabhost.setup(this,getSupportFragmentManager(),R.id.realtabcontent);

  nainActivity源码如下:

public class MainActivity extends AppCompatActivity {

    private FragmentTabHost mTabhost;   //获取FragmentTabHost控件
    private LayoutInflater mInflater;   //获取view需要一个LayoutInflater类型变量
    private List mTabs= new ArrayList<>(4);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initTab();


    }

    private void initTab() {                      //对Fragment的数据填充进行封装处理
        mTabhost=this.findViewById(android.R.id.tabhost);
        mInflater=LayoutInflater.from(this);    //初始化变量mInflater
        mTabhost.setup(this,getSupportFragmentManager(),R.id.realtabcontent); //调用setup方法,其中第3个参数为动态切换页面的布局空间

        Tab tab_home=new Tab(R.string.home,R.mipmap.home,HomeFragment.class);
        Tab tab_cart=new Tab(R.string.cart,R.mipmap.cart, CartFragment.class);
        Tab tab_hot=new Tab(R.string.hot,R.mipmap.hot, HotFragment.class);
        Tab tab_mine=new Tab(R.string.mine,R.mipmap.mine, MineFragment.class);

        mTabs.add(tab_home);
        mTabs.add(tab_cart);
        mTabs.add(tab_hot);
        mTabs.add(tab_mine);

        for (Tab tab: mTabs){       //该for循环表示从mTabs组中依次取出Tab类型的对象进行循环

            TabHost.TabSpec tabSpec=mTabhost.newTabSpec(getString(tab.getString()));

            tabSpec.setIndicator(bulidIndicator(tab));

            mTabhost.addTab(tabSpec, tab.getFragment(),null);

        }
        mTabhost.getTabWidget().setShowDividers(LinearLayout.SHOW_DIVIDER_NONE);//消除分割线

    }
    private View bulidIndicator(Tab tab){   //封装返回view
        View view=mInflater.inflate(R.layout.tab_indicator,null);
        ImageView img=view.findViewById(R.id.tab_icon);
        TextView txt=view.findViewById(R.id.txt_indicator);

        img.setBackgroundResource(tab.getImg());
        txt.setText(tab.getString()); //赋值图片和文字

        return view;
    }
}

  其中Tab类为自定义的类,包括需要动态变化的三个数据,分别是底部导航栏的图片,文字以及导航的fragment页面。

  Tab类如下:(alt+ins可以一键生成get set方法)

public class Tab {

    private int string;
    private int img;
    private Class fragment;

    public Tab(int string, int img, Class fragment) {
        this.string = string;
        this.img = img;
        this.fragment = fragment;
    }

    public void setString(int string) {
        this.string = string;
    }

    public void setImg(int img) {
        this.img = img;
    }

    public void setFragment(Class fragment) {
        this.fragment = fragment;
    }

    public int getString() {
        return string;
    }

    public int getImg() {
        return img;
    }

    public Class getFragment() {
        return fragment;
    }
}

   Tab数据类中Fragment是一个class文件,需要继承Fragment,其源码如下:

public class CartFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return  inflater.inflate(R.layout.fragment_cart,container,false);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/336619.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号