web-dev-qa-db-ja.com

Jetpackナビゲーション:アクションバーのタイトルと戻る/上矢印

Android Studioの最新のカナリアバージョンをインストールし、これに従いました( https://developer.Android.com/topic/libraries/architecture/navigation/navigation-implementing )単純な2ページのナビゲーションを実装する命令基本的にpage1にはボタンがあり、クリックするとアプリにpage2が表示されます。

それは機能しますが、1つの問題があります...アクションバーで自動的に何もしないようです。ナビゲーションライブラリによってアクションバーに上/戻る矢印と「ラベル」属性が自動的に表示されることになっていますか?または、以前のようにすべての作業を手動で行うことになっていますか? page2が表示されているときに、アクション(ツール)バーに戻る矢印と「詳細」を表示したい。

ページ1のボタンをクリックします。

override fun onViewCreated(view: View, savedInstanceState: Bundle?)
{
    button1.setOnClickListener {
        val nav = NavHostFragment.findNavController(this);
        nav.navigate(R.id.show_page2)
    }
}

メインアクティビティ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"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_height="?attr/actionBarSize"
        Android:elevation="4dp"
        Android:background="?attr/colorPrimary"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        Android:layout_width="match_parent">
    </androidx.appcompat.widget.Toolbar>

    <fragment
        Android:id="@+id/my_nav_Host_fragment"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar"
        app:navGraph="@navigation/nav_graph"/>

</androidx.constraintlayout.widget.ConstraintLayout>

ナビゲーショングラフ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/nav_graph"
            app:startDestination="@id/page1">

    <activity
        Android:id="@+id/mainActivity2"
        Android:name="com.Android.navtest.MainActivity"
        Android:label="activity_main"
        tools:layout="@layout/activity_main"/>
    <fragment
        Android:id="@+id/page1"
        Android:name="com.Android.navtest.BlankFragment2"
        Android:label="Home page"
        tools:layout="@layout/page1">
        <action
            Android:id="@+id/show_page2"
            app:destination="@id/page2"
            app:enterAnim="@anim/anim1"
            app:popExitAnim="@anim/anim2"/>
    </fragment>
    <fragment
        Android:id="@+id/page2"
        Android:name="com.Android.navtest.BlankFragment"
        Android:label="Details"
        tools:layout="@layout/page2"/>
</navigation>
11
Damn Vegetables

NavigationUI.setupActionBarWithNavController() を使用して、ActionBarをNavControllerに接続できます。これは通常、アクティビティでsetSupportActionBar()を呼び出した直後に行われます:

supportActionBar = findViewById<Toolbar>(R.id.toolbar)

// Get the NavController for your NavHostFragment
val navController = findNavController(R.id.nav_Host_fragment)

// Set up the ActionBar to stay in sync with the NavController
setupActionBarWithNavController(navController)

このアプローチは Google I/O 2018でのナビゲーショントーク で説明されています。

19
ianhanniballake

複数の場所でナビゲーションの戻るボタンを非表示にする場合(デフォルトはホームフラグメントのみ)、フラグメントのIDをAppBarConfigurationに追加し、これをsetupActionBarWithNavControllerの2番目のパラメーターとして渡すことができます。次に例を示します。

val appBarConfiguration = AppBarConfiguration(setOf(R.id.splashFragment, R.id.onboardingFragment, R.id.homeFragment))

setupActionBarWithNavController(findNavController(R.id.nav_Host), appBarConfiguration)
5
Rafols

これは私がやったことです

private lateinit var appBarConfiguration: AppBarConfiguration

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityGameConfigBinding =
            DataBindingUtil.setContentView(this, R.layout.activity_game_config)
        supportActionBar?.show()

        val navController = Navigation.findNavController(this, R.id.myNavHostFragment)
        NavigationUI.setupActionBarWithNavController(this, navController, null)
        appBarConfiguration = AppBarConfiguration.Builder(navController.graph)
            .build()

        NavigationUI.setupWithNavController(binding.navView, navController)
    }
    override fun onSupportNavigateUp(): Boolean {
        val navController = Navigation.findNavController(this, R.id.myNavHostFragment)
        return NavigationUI.navigateUp(navController, appBarConfiguration)
    }
0
nima moradi