Android开发:利用Android Studio自带的底部导航栏和ViewPager+TabLayout创建顶部导航栏

这篇具有很好参考价值的文章主要介绍了Android开发:利用Android Studio自带的底部导航栏和ViewPager+TabLayout创建顶部导航栏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

效果图

底部导航栏

​编辑

顶部导航栏

底部导航栏首个Fragment代码

适配器代码

顶部导航栏首个Fragment代码

 顶部导航栏另外三个Fragment代码

 ​编辑

顶部导航栏四个Fragment的XML

补充


效果图

学Android开发开始实操,第一步肯定要把大致布局搞定。做这个布局用到的知识难点有fragment,生命周期。

安卓studio导航栏,android,android studio,java

底部导航栏

首先使用Android Studio创建自带的组件创建底部导航栏(Bottom Navigation Views Activity)。创建出来的四个页面就是四个Fragment。这里为了代码简洁,不使用官方创建的MeViewModel.java,就把相关的代码注释了。

public class MeFragment extends Fragment {

    private FragmentMeBinding binding;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        //MeViewModel meViewModel =new ViewModelProvider(this).get(MeViewModel.class);

        binding = FragmentMeBinding.inflate(inflater, container, false);
        View root = binding.getRoot();

        //final TextView textView = binding.textMe;
        //meViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);
        return root;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
}

安卓studio导航栏,android,android studio,java

顶部导航栏

那么接下来就需要在其中一个Fragment创建顶部导航栏,这里选择的是第一个fragment——HomeFragment(首页)。可以看出在底部导航栏中官方使用的是Binding,但实际上比较常用的还是View,所以我就把首页的binding改成View,以及下面创建顶部导航栏的四个fragment也都有View。说白了就是把顶部导航栏的四个fragment嵌套到底部导航栏的一个fragment中。

底部导航栏首个Fragment代码

主要作用就是将顶部导航栏的四个title和fragment加入到homefragment。

重点讲一下这里出现的一个bug,花了我半天才解决。

现象:如果不加上pager.setOffscreenPageLimit(3),会出现切换底部导航再切换回首页时,首页中该显示的文字没有显示出来。

必备知识:先了解下父子fragment。顶部四个fragment是底部HomeFragment的ChildFragment,也就是HomeFragment是顶部四个fragment的ParentFragment。父fragment的消失会导致子fragment的消失。

原因:底部导航的切换,会导致切换前的fragment被杀掉,也就是HomeFragment被杀掉,再切回来时,子fragment并没有被创建,所以该显示的文字没有显示出来。

解决办法:那么我选择的解决办法是不让fragment被杀掉。所以pager.setOffscreenPageLimit(3)的意思就是让3个fragment“活”在内存里。

public class HomeFragment extends Fragment {

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        pager = view.findViewById(R.id.page);
        tabLayout = view.findViewById(R.id.tab_layout);
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    private ViewPager pager;
    private FragmentAdapter fragmentAdapter;
    private List<TabFragment> fragmentList;
    private TabLayout tabLayout;
    private List<String> mTitles;
    private String[] title = {"关注", "推荐", "排行榜", "会员"};


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        fragmentList=new ArrayList<>();
        mTitles=new ArrayList<>();
        for(int i=0;i<title.length;i++){
            mTitles.add(title[i]);
        }
        fragmentList.add(new AttentionFragment(title[0]));
        fragmentList.add(new TabFragment(title[1]));
        fragmentList.add(new ListFragment(title[2]));
        fragmentList.add(new VipFragment(title[3]));

        fragmentAdapter = new FragmentAdapter(getChildFragmentManager(), fragmentList, mTitles);
        pager.setAdapter(fragmentAdapter);
        //Set the number of offscreen pages (childfragments to keep in memory)
        pager.setOffscreenPageLimit(3);

        tabLayout.setupWithViewPager(pager);

        // 第二个选项卡的索引,注意索引从 0 开始
        int tabIndexToSwitchTo = 1;
        //转至第二个选项卡
        pager.setCurrentItem(tabIndexToSwitchTo);

    }
}

适配器代码

public class FragmentAdapter extends FragmentPagerAdapter {

    //各导航的Fragment
    private List<TabFragment> mFragmentList;
    //导航的标题
    private List<String> mTitle;

    public FragmentAdapter(FragmentManager fragmentManager, List<TabFragment>fragments, List<String>title){
        super(fragmentManager);
        mFragmentList=fragments;
        mTitle=title;

    }
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }
    @Override
    public CharSequence getPageTitle(int position) {
        return mTitle.get(position);
    }
}

顶部导航栏首个Fragment代码

public class TabFragment extends Fragment {
    private TextView titleTv;

    private String mTitle;

    //这个构造方法是便于各导航同时调用一个fragment
    public TabFragment(String title){
        mTitle=title;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
        View view=inflater.inflate(R.layout.fragment_tab,container,false);
        titleTv=view.findViewById(R.id.tv_title);
        titleTv.setText(mTitle);
        return view;
    }
}

 顶部导航栏另外三个Fragment代码

这三个代码都是继承首个fragment代码

public class ListFragment extends TabFragment{
    private TextView titleTv;

    public ListFragment(String title){
        super(title);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
        View view=inflater.inflate(R.layout.fragment_list,container,false);
        titleTv=view.findViewById(R.id.list_title);
        titleTv.setText("排行榜");
        return view;

    }

  @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Lifecycle1:","onCreate");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("Lifecycle1:","onDestroyView");
    }
    
    @Override
    public void onStart() {
        super.onStart();
        Log.d("Lifecycle1:","onStart");
    }
    @Override
    public void onResume() {
        super.onResume();
        Log.d("Lifecycle1:","onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d("Lifecycle1:","onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d("Lifecycle1:","onStop");
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("Lifecycle1:","onDestroy");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("Lifecycle1:","onDetach");
    }

}

 

顶部导航栏四个Fragment的XML

<?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">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="20sp"
        android:gravity="center"/>

</LinearLayout>

补充

显示底部导航栏文字:在activity_main.xml中添加以下代码。

app:labelVisibilityMode="labeled"

去除顶部导航栏上方的空白:在activity_main.xml中删除以下代码。

android:paddingTop="?attr/actionBarSize"

隐藏顶部栏:在MainActivity.java中添加以下代码。文章来源地址https://www.toymoban.com/news/detail-778906.html

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    if (getSupportActionBar() != null) {
        getSupportActionBar().hide();
    }
}

到了这里,关于Android开发:利用Android Studio自带的底部导航栏和ViewPager+TabLayout创建顶部导航栏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【UniApp开发小程序】顶部导航栏和底部导航栏设置+iconfont图标引入

    在正式开发小程序的功能之前,首先需要确定小程序的主要框架。 我的小程序需要创建的页面是“首页”、“我想要”、“私信”、“我的”,“首页”已经存在于项目中,不需要重复创建。创建过程如下: 创建成功,不仅创建了 star.vue , Hbuilder 还自动帮助创建了 star 文件

    2024年02月16日
    浏览(50)
  • 【易售小程序项目】顶部导航栏和底部导航栏设置+iconfont图标引入

    在正式开发小程序的功能之前,首先需要确定小程序的主要框架。 我的小程序需要创建的页面是“首页”、“我想要”、“私信”、“我的”,“首页”已经存在于项目中,不需要重复创建。创建过程如下: 创建成功,不仅创建了 star.vue , Hbuilder 还自动帮助创建了 star 文件

    2024年02月10日
    浏览(39)
  • uniapp使用自定义导航栏和手机自带的状态栏重叠

    【问题界面】: 【正常界面】: 【解决方法】: 在页面顶部添加代码 !-- #ifndef H5 -- statusBar/statusBar !-- #endif -- 2.引入占位条并注册

    2024年02月15日
    浏览(35)
  • Android 显示、隐藏状态栏和导航栏

    控制状态栏显示,Activity的主题中配置全屏属性 控制状态栏显示,在setContentView之前设置全屏的flag 复制代码 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 控制状态栏显示,在任何位置通过添加和移除全屏的flag 控制状态栏和导航栏显示,

    2024年02月08日
    浏览(40)
  • Android隐藏导航栏和状态栏的方法

    一。去除状态栏 以下是Android去除状态栏的代码示例: 1. 在Activity的onCreate()方法中添加以下代码: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 2. 在AndroidManifest.xml文件中的Activity节点中添加以下属性: android:theme=\\\"@android:style/Theme.NoTitleB

    2024年02月16日
    浏览(38)
  • Android全屏弹出Dialog显示状态栏和导航栏的问题及解决方案

    在移动端开发中,有时候我们需要在Android应用中弹出一个全屏的Dialog。然而,当我们尝试实现这样的Dialog时,可能会遇到一个问题:状态栏和导航栏在全屏Dialog中仍然可见,这可能会影响用户体验。本文将介绍如何解决这个问题,并提供相应的源代码。 问题描述: 当我们使

    2024年02月05日
    浏览(40)
  • android中实现底部导航栏

            底部导航栏在app应用中是十分常见了,大部分的安卓应用中也都实现了底部导航栏的功能,这里我就以我以前做的一个简单小说阅读软件为例,为大家演示一下底部导航栏的使用,需要的朋友直接复制代码过去改写就行了。         这里包含了一些进行操作实际

    2024年02月19日
    浏览(43)
  • Android底部导航栏之BottomNavigationView

    1,首先需要添加依赖: implementation \\\'com.google.android.material:material:1.1.0\\\' 2,布局文件中引入: 3,常用属性: app:itemTextColor 文字的颜色,可以通过 selector 来控制选中和未选中的颜色 app:itemIconTint 图标的颜色,可以通过 selector 来控制选中和未选中的颜色 app:itemIconSize 图标大小,

    2024年02月08日
    浏览(71)
  • Android---DslTabLayout实现底部导航栏

    1. 在 Android 项目中引用 JitPack 库  AGP 8.+ 根目录的 settings.gradle  AGP 8.+ 根目录如果是  settings.gradle.kts 文件  AGP 8.- 根目录的 build.gradle 2. 添加依赖  在APP目录中的 build.gradle 3. 布局 activity_main.xml 4. 底部 tab_item.xml 布局 5. 每个底部 tab 对应的 fragment a. DiscoveryFragment b. fragment_dis

    2024年02月20日
    浏览(41)
  • Android BottomNavigation底部导航栏使用

    原文地址: Android BottomNavigation底部导航栏使用 - Stars-One的杂货小窝 本文侧重点记录一些特殊的样式设置,所以基本使用这里就简单概述一下,详细图文可以去找其他人的博文 1.创建对应的menu菜单文件 2.xml布局引用menu菜单 3.启动Activity预览效果 可以使用 setOnItemSelectedListener 方法监

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包