web-dev-qa-db-ja.com

AndroidナビゲーションUIライブラリでBottomNavigationViewを使用してナビゲートするときにアクションバーから上ボタンを削除する

BottomNavigationViewを介したトップレベルナビゲーション用の3つのフラグメントを持つ小さなアプリを作成しました。アプリを起動して、下部のナビゲーションのナビゲーションボタンをクリックすると、アクションバーに上ボタンが表示されます。アクティビティのコードは次のとおりです。

class MainActivity : AppCompatActivity() {

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

        setSupportActionBar(toolbar)

        val navController = navHostFragment.findNavController()
        setupActionBarWithNavController(this, navController)
        setupWithNavController(bottomNav, navController)
    }

    override fun onSupportNavigateUp(): Boolean
            = findNavController(navHostFragment).navigateUp()

}

これが結果のスクリーンショットです。アプリはホーム画面で起動し、BottomNavigationViewからプロフィールボタンをクリックするだけで済みます。

enter image description here

私はBottomNavigationViewのアイテム選択を聞いて、手動でさまざまな NavOptions を使用してナビゲートしてみましたが、役に立ちませんでした。ユーザーがBottomNavigationViewで移動しているときにアクションバーに上ボタンを表示しないようにするためにできることはありますか?

18
jeffmcnd

1.0.0-alpha07以降、AppBarConfigurationを使用してその動作を構成できます。

AppBarConfigurationにはBuilderコンストラクターがあるため、Builderによって参照されるトップレベルの宛先の特定のセットで新しいidを作成できます(このidはナビゲーションレイアウトで設定したもの)。

新しいAppBarConfigurationを作成:

_val appBarConfiguration = AppBarConfiguration
            .Builder(
                    R.id.navigationHomeFragment,
                    R.id.navigationListFragment,
                    R.id.navigationProfileFragment)
            .build()
_

次に、setupActionBarWithNavController(this, navController)の代わりにsetupActionBarWithNavController(this, navController, appBarConfiguration)を呼び出す必要があります

これは、上位のナビゲーション動作を処理する正しい方法です。

28
Javier Cancio

同じ問題があり、NavController.addOnNavigatedListenerを使用して現在のフラグメントを取得する方法を見つけたので、次のロジックをアクティビティ内に適用し、今それは私のために働きます

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_home)
    val navHost = supportFragmentManager
            .findFragmentById(R.id.navHostFragment) as NavHostFragment

    navHost.navController.addOnNavigatedListener { _, destination ->
        val showButton = showUpButton(destination.id)
        //Here occurs the magic
        supportActionBar?.setDisplayShowHomeEnabled(showButton)
        supportActionBar?.setDisplayHomeAsUpEnabled(showButton)
    }
}

//Check according to your convenience which fragment id
//should show or hide the "Up Button"
private fun showUpButton(id: Int): Boolean {
    return id != R.id.your_home_fragment && id != R.id.your_list_fragment 
            && id != R.id.your_profile_fragment
}

そして、これは私のプロジェクトです...

enter image description here

それが最善の選択肢かどうかはわかりませんが、誰かより良い提案があれば、それは歓迎されます

6
Julio Lemus

setupWithNavControllerの代わりにこれを使用してください:

navController.addOnNavigatedListener(new NavController.OnNavigatedListener() {
     @Override
     public void onNavigated(@NonNull NavController controller, @NonNull NavDestination destination) {
         toolbar.setTitle(destination.getLabel());
     }
});

または、Kotlinの同等のもの。

setupWithNavControllerが行う唯一のことは、ツールバーのタイトルを変更するリスナーを追加し、上ボタンを作成することです。上ボタンが不要な場合は、ツールバーのタイトルのみを変更するリスナーを追加します。

4
Bob bobbington

NavigationUI.setupWithNavControllerを使用している場合 onNavDestinationSelected を確認してください。

下部のナビゲーションビューmenu.xml内で、対応するMenuItemAndroid:menuCategory="secondary"を追加します。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">

  <item
    Android:id="@+id/profileFragment"
    Android:icon="@drawable/bottom_nav_icon_profile"
    Android:menuCategory="secondary"
    Android:title="@string/profile" />
1
CHAN