Fragment和BottomNavigationview实现导航布局

本文介绍了如何使用Fragment和BottomNavigationView实现简单的导航布局。通过在Activity中作为Fragment的宿主,配合BottomNavigationView作为底部标签,以及 Framelayout 作为Fragment的容器,利用FragmentManager进行Fragment的切换,实现类似wanAndroid App的导航栏效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路分析

实现导航栏有很多思路,一种比较简单的方法是使用 Fragment 和 BottomNavigationView 实现

  • Activity 作为 Fragment 的宿主
  • BottomNavigationview 作为底部 tab 用来切换
  • Framelayout 作为 Fragment 的容器
  • FragmentManager (FragmentTransaction) 作为隐藏和显示的开关

思路很简单,实现起来也很简单,我看到 wanAndroid 这款 APP 就是使用这种思路做的导航栏

效果如下 效果

代码

Activity

package me.tinuv.fragmentfornavi;

import android.os.Bundle;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayList<Fragment> fragments;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fragments = new ArrayList<>();
        fragments.add(HomeFragment.newInstance());
        fragments.add(DashBoardFragment.newInstance());
        fragments.add(NoticeFragment.newInstance());
        BottomNavigationView navigation = findViewById(R.id.navigation);
        FragmentManager fm = getSupportFragmentManager();
        fm.beginTransaction().add(R.id.fragment_container, fragments.get(0), "HOME")
                .add(R.id.fragment_container, fragments.get(1), "DASHBOARD")
                .add(R.id.fragment_container, fragments.get(2), "NOTICE")
                .commit();

        fm.beginTransaction()
                .hide(fragments.get(1))
                .hide(fragments.get(2))
                .commit();

        navigation.setOnNavigationItemSelectedListener((item) -> {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    fm.beginTransaction()
                            .hide(fragments.get(1))
                            .hide(fragments.get(2))
                            .show(fragments.get(0))
                            .commit();
                    return true;
                case R.id.navigation_dashboard:
                    fm.beginTransaction()
                            .hide(fragments.get(0))
                            .hide(fragments.get(2))
                            .show(fragments.get(1))
                            .commit();
                    return true;
                case R.id.navigation_notifications:
                    fm.beginTransaction()
                            .hide(fragments.get(0))
                            .hide(fragments.get(1))
                            .show(fragments.get(2))
                            .commit();
                    return true;
            }
            return false;
        });
    }

}

Fragment

很简单,没有太多东西

package me.tinuv.fragmentfornavi;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class HomeFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.layout_home, container, false);
    }

    public static HomeFragment newInstance() {

        return new HomeFragment();
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity"
    android:gravity="bottom">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="500dp">
    </FrameLayout>

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?android:attr/windowBackground"
        app:menu="@menu/navigation" />
</LinearLayout>
??正文结束??
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值