android-fragments 安卓Kotlin:如何更改Activity中一个片段的应用栏/工具栏?

bt1cpqcv  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(175)

在我的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)

这成功地把我的标志在中心,但它改变了每一个碎片应用程序栏,而不仅仅是主页碎片。我还希望能够编辑标志的大小和工具栏的大小。

tvokkenx

tvokkenx1#

将主题设置为NoActionBar,然后根据需要在每个片段的AppBarLayout中设置自定义toolbar

qyzbxkaa

qyzbxkaa2#

典型的建议是从Activity中删除工具栏,并在每个Fragment的布局中添加一个。如果你做的是单活动应用,你可能会遇到“我并不总是需要工具栏”的情况,而如果是共享活动,它不能包含未在所有组件之间共享的内容。
请记住,如果您这样做,setUpWithNavController调用将使用导航图中目的地上设置的任何label值来设置工具栏上的标题。标题可能会在片段更改前的一瞬间更改为新的目标。如果目标有工具栏并且标题在同一位置,这不是问题-但是如果一个是居中的,你可能会看到一个小故障,因为如果标题提前更改,它会很明显
另一件你可以尝试的事(我自己还没有做过,但这是一个想法)是让Activity管理工具栏--高度、居中等。当一个片段附加时,它可以通知Activity它需要工具栏的外观。您可以在父Activity上有一个接口,或者有一个ViewModel,其中包含它观察到的一些ToolbarConfig值,并且片段设置,可能想研究一下使用CoordinatorLayout来使它变大和变小,就像幻想一样

ix0qys7i

ix0qys7i3#

这就是我在片段之间无缝滑动所做的。我可以在任何工具栏上放置任何按钮并调整它们的大小。当它前后滑动时,你可以同时看到两个工具栏,并且很容易对移动做出React。我应该注册Git发布一个示例,因为这样可能更容易看到它的运行。
此按钮:

<ImageButton
android:id="@+id/btnDroid"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="46dp"
android:background="@drawable/ic_bot"
android:contentDescription="@string/app_name"
android:elevation="4dp"
app:layout_constraintBottom_toBottomOf="@+id/appBarLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/appBarLayout"
tools:ignore="DuplicateSpeakableTextCheck,TouchTargetSizeCheck" />

在看起来像Activity主工具栏的地方,但实际上不是。TouchTargetSizeCheck并不重要,因为按钮的大小为48x48。此按钮位于运行约束布局的第一个片段文件fragment_first.xml中:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

工具栏可以轻松调整大小,并具有任何文本标题:

<com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/Theme.MaterialComponents.DayNight"
        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:backgroundTint="@color/teal_700"
            android:contentDescription="@string/app_name"
            android:theme="@style/Theme.MaterialComponents.DayNight"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:titleTextColor="@color/white"
            app:title="@string/app_name"/>
    </com.google.android.material.appbar.AppBarLayout>

我想我会在未来的应用程序中实现这一点,因为我找不到官方文档。

相关问题