使用Java中的NavController为每个片段设置工具栏主题

时间:2019-03-23 20:45:54

标签: java android android-toolbar android-theme android-architecture-navigation

编辑: 我找到了解决方案。我创建了一个单独的活动,包括该活动内的另一个工具栏。然后,我创建了第二个导航图,并将其添加到第二个活动中。我使用了与我的MainActivity相同的方法,使用NavController设置了第二个工具栏。就像我想要的一样!

我正在将新的导航组件与应用程序中的单个“活动”方法一起使用。我想为每个Fragment设置ToolBar样式,以保持导航控制器功能(如导航和标题)。

最初,我尝试搜索如何使用其他主题为Fragments充气。我拒绝了这个主意,因为

  • 它没有真正起作用

  • 我只需要为工具栏设置主题。 URL

我发现这个与Kotlin兼容的项目。但是,它使用的BottomNavigation在我的应用程序中不存在。 https://android.jlelse.eu/a-quick-glance-on-single-activity-approach-with-navigation-component-f3b96b3b0a58

来自该项目:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fragHost"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/nav_graph"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:defaultNavHost="true" />

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:orientation="horizontal"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/navigation" />

</android.support.constraint.ConstraintLayout>

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        navigation.setupWithNavController(findNavController(R.id.fragHost))
    }

override fun onSupportNavigateUp() = findNavController(R.id.fragHost).navigateUp()

FirstFragment.kt

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        collapsingToolbar.setupWithNavController(toolbar, findNavController())
    }

SecondFragment.kt

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        changeStatusBarColor(R.color.colorBlue)
        return inflater.inflate(R.layout.fragment_second, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        toolbar.setupWithNavController(findNavController())
    }

    override fun onDestroyView() {
        super.onDestroyView()

        changeStatusBarColor(R.color.colorPrimaryDark)
    }

    private fun changeStatusBarColor(colorResId: Int) {
        activity?.window?.statusBarColor = ContextCompat.getColor(context!!, colorResId)
    }

到目前为止,我已经能够在MainActivity中找到如何使用工具栏设置导航控制器的方法。这允许正确的向上导航操作,但不允许自定义主题。参考:https://developer.android.com/guide/navigation/navigation-ui#top_app_bar

在MainActivity.java中,我做了以下

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Toolbar toolbar = findViewById(R.id.toolbar);
        final int[] topDestination = { R.id.loginFragment, R.id.mainFragment };
        AppBarConfiguration.Builder abcBuiler = new AppBarConfiguration.Builder(topDestination);
        AppBarConfiguration abc = abcBuiler.build();
        NavController navController = Navigation.findNavController(this, R.id.fragHost);
        // Set up navigation controller toolbar
        NavigationUI.setupWithNavController(toolbar, navController, abc);
}

toolbar.setupWithNavController(findNavController())函数在Java中不存在,或者至少我找不到它。

NavigationUI.setupWithNavController(toolbar,navController,AppBarConfiguration);一次在MainActivity中设置了工具栏,而我找不到在片段中对其主题化的方法。

0 个答案:

没有答案