You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BottomNavigationViewEX切换页面时顶部及底部栏重复加载问题求助

解决BottomNavigationViewEX切换页面全量重载的问题

嘿,我来帮你搞定这个BottomNavigationViewEX的页面重载问题!

你现在遇到的核心问题是:每次点击底部导航按钮时都启动了新的Activity,而Activity的启动会完整初始化整个页面(包括顶部栏、底部导航这些公共UI组件),所以才会出现全页面重新加载的情况。

最优解决方案:用Fragment代替Activity做页面切换

我们可以重构架构,用一个主Activity来承载顶部栏和底部导航栏,中间的内容区域用Fragment来切换,这样公共部分(顶部、底部栏)只会初始化一次,切换时只更新中间的内容区域。

步骤1:创建主Activity的布局

把顶部栏、Fragment容器、BottomNavigationViewEX放在同一个布局里:

<?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"
    android:orientation="vertical">

    <!-- 你的顶部栏(比如Toolbar) -->
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"/>

    <!-- Fragment容器:用来切换不同页面内容 -->
    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <!-- BottomNavigationViewEX -->
    <com.ittianyu.bottomnavigationviewex.BottomNavigationViewEX
        android:id="@+id/BottomNavViewBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"/>

</LinearLayout>

步骤2:修改主Activity的逻辑

在主Activity里初始化BottomNavigationViewEX,并设置点击事件来切换Fragment:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupBottomNavigationView();
        
        // 首次进入默认加载第一个Fragment
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, new HomeFragment())
                    .commit();
        }
    }

    private void setupBottomNavigationView() {
        Log.d(TAG, "setupBottomNavigationView: setting up BottomNavigationView");
        BottomNavigationViewEx bottomNavigationViewEx = findViewById(R.id.BottomNavViewBar);
        BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
        
        // 设置导航项点击监听,切换对应Fragment
        bottomNavigationViewEx.setOnNavigationItemSelectedListener(item -> {
            Fragment selectedFragment = null;
            switch (item.getItemId()) {
                case R.id.nav_home:
                    selectedFragment = new HomeFragment();
                    break;
                case R.id.nav_search:
                    selectedFragment = new SearchFragment();
                    break;
                case R.id.nav_profile:
                    selectedFragment = new ProfileFragment();
                    break;
                // 根据你的导航项添加更多case
            }
            
            if (selectedFragment != null) {
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment_container, selectedFragment)
                        .commit();
                return true;
            }
            return false;
        });
    }
}

步骤3:创建对应的Fragment页面

把原来每个Activity的内容改成Fragment,比如HomeFragment:

public class HomeFragment extends Fragment {
    private static final String TAG = "HomeFragment";

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 加载Fragment的布局
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        // 在这里初始化Fragment内的控件和业务逻辑
        return view;
    }
}

额外说明

  • 这样修改后,底部导航切换时只会更新中间的Fragment内容,顶部栏和底部导航栏作为主Activity的一部分,不会被重新创建,彻底解决全页面重载的问题。
  • 如果需要保留Fragment的状态(比如滚动位置、输入内容),可以在Fragment中重写onSaveInstanceState方法保存数据,或者使用ViewPager2 + FragmentStateAdapter的组合(适合需要保留多个Fragment状态的场景)。

内容的提问来源于stack exchange,提问作者Daniel Morena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:01:30