使用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
相关产品推荐
相关产品推荐

