如何修复重叠的片段
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>
main.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();
【讨论】:
以上是关于如何修复重叠的片段的主要内容,如果未能解决你的问题,请参考以下文章