片段替换整个屏幕

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>

【讨论】:

以上是关于片段替换整个屏幕的主要内容,如果未能解决你的问题,请参考以下文章

片段布局不覆盖整个屏幕

片段覆盖整个android编辑屏幕

如何让 Leanback 的详细信息片段不占用整个屏幕?

如何从(和替换)TabLayout 和 ViewPager 移动到新片段?

如何在底部导航中使用设置屏幕外页面限制

屏幕旋转后Android片段重叠