web-dev-qa-db-ja.com

ナビゲーションコンポーネントの開始先で戻るボタンを処理する方法

新しいナビゲーションコンポーネントの使用を開始し、実際に掘り下げています。ただし、1つの問題があります。グラフの最初の宛先にいるときに、戻るボタンをどのように処理するのですか?

これは私が今使っているコードです:

findNavController(this, R.id.my_nav_Host_fragment)
                .navigateUp()

私がグラフのどこかにいるときは、それは素晴らしい働きをしていて、私を送り返しますが、私がそれの始めにいるとき-バックスタックが空なのでアプリがクラッシュします。

これはすべて私にとって理にかなっています、私はそれをどう処理するかわかりません。

現在のフラグメントのIDがグラフのルートであることがわかっているものと同じであるかどうかを確認できますが、グラフの現在の場所が現在の場所ではないかどうかのブールフラグのようなよりエレガントな解決策を探しています開始場所かどうか。

アイデア?

7

「onBackPressed」をオーバーライドしてはなりません。「onSupportNavigateUp」をオーバーライドしてそこに配置してください。

findNavController(this, R.id.my_nav_Host_fragment)
            .navigateUp()

公式ドキュメントから:AppCompatActivity.onSupportNavigateUp()も上書きし、NavController.navigateUpを呼び出します

https://developer.Android.com/topic/libraries/architecture/navigation/navigation-implementing

6
Alex

出発地にいるときにアクティビティを終了し、ナビゲーショングラフをさらに下にいるときに通常の「navigateUp」を実行したいという同様のシナリオがありました。私は簡単な拡張機能でこれを解決しました:

fun NavController.navigateUpOrFinish(activity: AppCompatActivity): Boolean {
return if (navigateUp()) {
    true
} else {
    activity.finish()
    true
}

}

そしてそれを次のように呼び出します:

override fun onSupportNavigateUp() = 
        findNavController(R.id.nav_fragment).navigateUpOrFinish(this)

しかし、私がNavigationUIを使用することはできませんでした。これは、開始先にいるときは常に戻る矢印を非表示にするためです。だから代わりに:

NavigationUI.setupActionBarWithNavController(this, controller)

私はホームアイコンを手動で制御しました:

setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_navigation_back)
5

アクティビティのonBackPressedをオーバーライドして、現在の宛先が開始宛先かどうかを確認します。

実際には次のようになります。

@Override
public void onBackPressed() {
    if (Navigation.findNavController(this,R.id.nav_Host_fragment)
            .getCurrentDestination().getId() == R.id.your_start_destination) {
        // handle back button the way you want here
        return;
    }
    super.onBackPressed();
}
3
Shynline

私の戻るボタンが正しく機能し、NavController.navigateUp()を使用すると、宛先の戻るボタンがクラッシュしました。このコードを次のように変更しました。その他の可能性は、currentDestination == startDestination.idかどうかを確認することですが、アクティビティを閉じて、他のアクティビティに戻りたいです。

override fun onSupportNavigateUp() : Boolean {
        //return findNavController(R.id.wizard_nav_Host_fragment).navigateUp()
        onBackPressed()
        return true
    }
0
Michał Ziobro

「ルート」ナビゲーショングラフの開始を意味する場合(ナビゲーショングラフがネストされている場合に備えて)、少なくとも ナビゲーションの原則 に従って、上ボタンをまったく表示しないでください。

0
Mike Scamell