如何修复重叠的片段

Posted

技术标签:

【中文标题】如何修复重叠的片段【英文标题】:How do i fix overlapping fragments 【发布时间】:2022-01-10 12:49:21 【问题描述】:

我有一个顶栏和一个底栏。我想从顶部菜单到某些地方,从底部菜单到某些地方。但这两个部分相互重叠,我该如何在片段中解决这个问题。我制作了 Twitter 样式的底部和顶部组件,但是片段被覆盖了。

我搜索了片段删除代码,但找不到。

你能告诉我哪里出错了吗?

谢谢。

FeedActivity2.kt

package com.ager.sutra

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.fragment.app.Fragment
import androidx.navigation.NavController
import androidx.navigation.Navigation
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.NavigationUI
import com.ager.sutra.databinding.ActivityFeed2Binding
import com.google.android.material.navigation.NavigationView
import com.ager.sutra.fragments.HomeFragment
import com.ager.sutra.fragments.MessageFragment
import com.ager.sutra.fragments.ProfileFragment
import com.ager.sutra.fragments.SearchFragment


class FeedActivity : AppCompatActivity() 

private lateinit var binding : ActivityFeed2Binding
private lateinit var fragmentLane : Fragment
private val homeFragment = HomeFragment()
private val searchFragment = SearchFragment()
private val messageFragment = MessageFragment()

override fun onCreate(savedInstanceState: Bundle?) 

    super.onCreate(savedInstanceState)
    binding = ActivityFeed2Binding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)



    val drawerLayout : DrawerLayout = findViewById(R.id.drawerLayout)

    binding.imageMenu.setOnClickListener(View.OnClickListener 

        drawerLayout.openDrawer(GravityCompat.START) )

    val navView : NavigationView = findViewById(R.id.navigationView)


    val navController : NavController = 
    Navigation.findNavController(this,R.id.navHostFragment)

    try 
        NavigationUI.setupWithNavController(navView, navController)
    catch (e : Exception)
        println(e.localizedMessage)
    



    val bottomNav = binding.bottomNavigation
    bottomNav.setOnItemSelectedListener 
        when(it.itemId)
            R.id.bottom_home -> makeCurrentFragment(homeFragment)
            R.id.bottom_search -> makeCurrentFragment(searchFragment)
            R.id.bottom_messages -> makeCurrentFragment(messageFragment)
        
        true
    




private fun makeCurrentFragment(fragment: Fragment) =

    supportFragmentManager.beginTransaction().apply
        replace(R.id.navHostFragment, fragment)
        commit()
    


activity_feed2.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 
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:layout_
android:layout_
android:id="@+id/drawerLayout"
tools:context=".FeedActivity"
>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_
    android:layout_>

    <LinearLayout
        android:id="@+id/layoutToolBar"
        android:layout_
        android:layout_
        android:background="@color/darkGray"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingStart="15dp"
        android:paddingEnd="15dp"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/imageMenu"
            android:layout_
            android:layout_
            android:contentDescription="@string/app_name"
            android:src="@drawable/ic_baseline_menu_24"
            app:tint="@color/white" />
        
        <TextView
            android:id="@+id/textTitle"
            android:layout_
            android:layout_
            android:layout_marginStart="15dp"
            android:text="@string/app_name"
            android:textColor="@color/yellow"
            android:textSize="20sp"
            android:textStyle="bold"/>

    </LinearLayout>

    <fragment
        android:layout_
        android:layout_
        app:layout_constraintTop_toBottomOf="@id/layoutToolBar"
        app:layout_constraintBottom_toTopOf="@id/bottom_navigation"
        android:id="@+id/navHostFragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost = "true"
        app:navGraph="@navigation/main"
        app:background="@color/darkGray"
        />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_
        android:layout_
        android:background="@color/darkGray"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:itemRippleColor="@android:color/transparent"
        app:itemIconSize="24dp"
        app:labelVisibilityMode="unlabeled"
        app:itemIconTint="@drawable/bottom_itemselector"
        app:menu="@menu/bottom_menu"
        >

    </com.google.android.material.bottomnavigation.BottomNavigationView>


</androidx.constraintlayout.widget.ConstraintLayout>

<com.google.android.material.navigation.NavigationView
    android:id="@+id/navigationView"
    android:layout_
    android:layout_
    app:menu="@menu/nav_menu"
    app:headerLayout="@layout/nav_header"
    android:layout_gravity="start"/>

</androidx.drawerlayout.widget.DrawerLayout>

ma​​in.xml(导航)

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/main"
app:startDestination="@+id/nav_home">

<fragment
    android:id="@+id/nav_home"
    android:name="com.ager.sutra.fragments.HomeFragment"
    android:label="Home"
    tools:layout="@layout/fragment_home" />
<fragment
    android:id="@+id/nav_profile"
    android:name="com.ager.sutra.fragments.ProfileFragment"
    android:label="Profile"
    tools:layout="@layout/fragment_profile" />
<fragment
    android:id="@+id/nav_settings"
    android:name="com.ager.sutra.fragments.SettingsFragment"
    android:label="Settings"
    tools:layout="@layout/fragment_settings" />
<fragment
    android:id="@+id/messageFragment"
    android:name="com.ager.sutra.fragments.MessageFragment"
    android:label="Message"
    tools:layout="@layout/fragment_message" />
</navigation>

【问题讨论】:

【参考方案1】:

您需要在 NavigationController 上进行设置。 魔法发生在下面 =)

setSupportActionBar(binding.appBarMain.toolbar);
DrawerLayout drawer = binding.drawerLayout;
    NavigationView navigationView = binding.navView;
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
            .setOpenableLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);

另外,不要忘记 OnSupportNavigateUp 来处理抽屉布局图标点击

@Override
public boolean onSupportNavigateUp() 
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
    return NavigationUI.navigateUp(navController, mAppBarConfiguration)
            || super.onSupportNavigateUp();

【讨论】:

以上是关于如何修复重叠的片段的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 iOS 7 中的状态栏重叠问题

如何修复与Recyclerview重叠的视图?

如何修复表格视图的搜索栏与状态栏重叠

如何修复 g++ 内存范围重叠?

如何修复画布中重叠的VBox儿童?

如何修复空白片段?