在我的Android应用程序中,我的主要活动中有4个片段,我可以向左和向右滑动来访问它们。
现在,每个片段都有与activity_main.xml中布局相同的应用栏:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/windowBackground"
tools:context=".ui.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/colorPrimary"
android:contentDescription="@string/content_basic_toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:titleTextColor="@color/white"/>
</com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/bottomNavColor"
app:itemIconTint="@drawable/bottom_nav_color_selector"
app:itemTextColor="@drawable/bottom_nav_color_selector"
app:labelVisibilityMode="labeled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/navigation" />
<ImageButton
android:id="@+id/user_button"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginEnd="8dp"
android:background="#00FFFFFF"
android:elevation="4dp"
android:contentDescription="@string/user"
app:layout_constraintBottom_toBottomOf="@+id/appBarLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/appBarLayout"
app:srcCompat="@drawable/ic_user" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/mainNavigationFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@+id/bottom_navigation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBarLayout"
app:navGraph="@navigation/main_nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>
不过,我想改变其中一个片段(家庭片段)的应用程序栏,使其有一个居中的标志和更高的高度。
这是我的MainActivity.kt,其中配置了应用栏/导航控制器/片段:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
lateinit var user: ImageButton
lateinit var toolbar: Toolbar
lateinit var bottomNavigationView: BottomNavigationView
lateinit var loginViewModel: LoginViewModel
lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java)
toolbar = binding.toolbar
bottomNavigationView = binding.bottomNavigation
user = binding.userButton
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
Fresco.initialize(this)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.mainNavigationFragment) as NavHostFragment
navController = navHostFragment.navController
bottomNavigationView.setupWithNavController(navController)
// Set up tool bar with navController and appBarConfiguration
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.homeFragment,
R.id.mapFragment,
R.id.resourcesFragment,
R.id.moreFragment
)
)
toolbar.setupWithNavController(navController, appBarConfiguration)
// Show navigation bar and user bottom on top level fragments
navController.addOnDestinationChangedListener { _, destination, _ ->
when (destination.id) {
R.id.homeFragment,
R.id.mapFragment,
R.id.resourcesFragment,
R.id.moreFragment -> {
bottomNavigationView.visibility = View.VISIBLE
user.visibility = View.VISIBLE
}
else -> {
bottomNavigationView.visibility = View.GONE
user.visibility = View.GONE
}
}
}
user.setOnClickListener {
loginViewModel.loadAccount(this@MainActivity, binding.root) {
navController.navigate(R.id.userFragment)
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 1) {
user.callOnClick()
}
}
}
到目前为止,我已经尝试过:
在我的HomeFragment.kt onCreateView中,我想在其中更改应用程序栏/工具栏,我添加了以下代码行:
(activity as MainActivity?)!!.supportActionBar!!.setLogo(R.drawable.logo_mt)
这成功地把我的标志在中心,但它改变了每一个碎片应用程序栏,而不仅仅是主页碎片。我还希望能够编辑标志的大小和工具栏的大小。
3条答案
按热度按时间tvokkenx1#
将主题设置为
NoActionBar
,然后根据需要在每个片段的AppBarLayout
中设置自定义toolbar
qyzbxkaa2#
典型的建议是从
Activity
中删除工具栏,并在每个Fragment
的布局中添加一个。如果你做的是单活动应用,你可能会遇到“我并不总是需要工具栏”的情况,而如果是共享活动,它不能包含未在所有组件之间共享的内容。请记住,如果您这样做,
setUpWithNavController
调用将使用导航图中目的地上设置的任何label
值来设置工具栏上的标题。标题可能会在片段更改前的一瞬间更改为新的目标。如果目标有工具栏并且标题在同一位置,这不是问题-但是如果一个是居中的,你可能会看到一个小故障,因为如果标题提前更改,它会很明显另一件你可以尝试的事(我自己还没有做过,但这是一个想法)是让Activity管理工具栏--高度、居中等。当一个片段附加时,它可以通知Activity它需要工具栏的外观。您可以在父Activity上有一个接口,或者有一个
ViewModel
,其中包含它观察到的一些ToolbarConfig
值,并且片段设置,可能想研究一下使用CoordinatorLayout
来使它变大和变小,就像幻想一样ix0qys7i3#
这就是我在片段之间无缝滑动所做的。我可以在任何工具栏上放置任何按钮并调整它们的大小。当它前后滑动时,你可以同时看到两个工具栏,并且很容易对移动做出React。我应该注册Git发布一个示例,因为这样可能更容易看到它的运行。
此按钮:
在看起来像Activity主工具栏的地方,但实际上不是。TouchTargetSizeCheck并不重要,因为按钮的大小为48x48。此按钮位于运行约束布局的第一个片段文件fragment_first.xml中:
工具栏可以轻松调整大小,并具有任何文本标题:
我想我会在未来的应用程序中实现这一点,因为我找不到官方文档。