片段替换整个屏幕
Posted
技术标签:
【中文标题】片段替换整个屏幕【英文标题】:Fragment replaces entire screen 【发布时间】:2021-03-02 00:22:40 【问题描述】:我有以下结构,片段替换/添加不仅替换其主机视图,而且替换整个屏幕。这是什么原因造成的?
没有数据的主Activity布局
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
tools:context=".activity.MainActivity">
<FrameLayout
android:id="@+id/nav_host_fragment"
android:layout_
android:layout_
android:layout_weight="12"
app:defaultNavHost="true" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_
android:layout_
android:layout_gravity="bottom"
android:layout_weight="1"
app:labelVisibilityMode="unlabeled"
android:background="@drawable/transparent_button"
app:onNavigationItemSelected="@viewModel::onNavigationItemSelected"
app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
app:menu="@menu/bottom_navigation_menu" />
</LinearLayout>
片段布局
<FrameLayout
android:layout_
android:layout_
android:paddingTop="?android:attr/actionBarSize"
tools:context=".fragment.HomeFragment">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_
android:layout_
android:layout_gravity="bottom|end"
android:layout_margin="20dp"
android:background="@drawable/transparent_button"
android:onClick="@viewModel::onFloatingButtonClicked"
android:src="@drawable/ic_baseline_add_24" />
</FrameLayout>
主要活动 onCreate
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainViewModel = ViewModelProviders.of(this, new ViewModelFactory(getApplication())).get(MainViewModel.class);
activityMainBinding.setViewModel(mainViewModel);
activityMainBinding.executePendingBindings();
fragmentList.put(FragmentsEnum.HOME.getValue(), new HomeFragment());
fragmentList.put(FragmentsEnum.PROFILE.getValue(), new ProfileFragment());
Fragments.addFragment(getSupportFragmentManager(), R.id.nav_host_fragment, fragmentList.get(FragmentsEnum.HOME.getValue()), FragmentsEnum.HOME.getValue()); // DEFAULT FRAGMENT
片段实用程序
public static void addFragment(FragmentManager manager, int containerId, Fragment fragment, String tag)
if (!manager.isStateSaved())
manager.beginTransaction().add(containerId, fragment, tag).commit();
在查看主要活动时,我将 Home Fragment 设置为在活动开始时处于活动状态。但它隐藏了我的底部导航栏并替换了整个屏幕。
【问题讨论】:
【参考方案1】:我认为这是使用 LinearLayout 作为片段和底部导航的根元素的问题。尝试用 ConstraintLayout 或 CoordinatorLayout 替换它。如果这些都不起作用,请尝试从 Fragment 中删除顶部填充。
【讨论】:
【参考方案2】:您的 FrameLayout 将与 BottomNavigationView 重叠。此外,您应该为您的导航主机使用 FragmentContainerView。您希望您的 FragmentContainerView 显式位于您的 BottomNavigationView 上方。我将您的 LinearLayout 更改为具有适当约束的 ConstraintLayout:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
tools:context=".activity.MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:layout_
android:layout_
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/bottom_nav"
app:defaultNavHost="true" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_
android:layout_
app:labelVisibilityMode="unlabeled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:background="@drawable/transparent_button"
app:onNavigationItemSelected="@viewModel::onNavigationItemSelected"
app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
app:menu="@menu/bottom_navigation_menu" />
</androidx.constraintlayout.widget.ConstraintLayout>
【讨论】:
以上是关于片段替换整个屏幕的主要内容,如果未能解决你的问题,请参考以下文章