新しいナビゲーションアーキテクチャコンポーネントを使用して、メイン画面(FloatingActionButton
がBottomAppBar
にアタッチされている)から別の画面に移動する方法がわかりませんなしアプリバー。
ファブをクリックすると、次の画面(フラグメント?)を右からスライドさせます。問題は、BottomAppBar
をどこに置くかです。 MainActivity
に入れると、FloatingActionButton
にNavController
が設定されていないという問題があります。また、BottomAppBar
をフラグメントに入れることもできません。私は途方に暮れています。
今日この問題に遭遇しました、そして私はそれのためのシンプルでエレガントな解決策があることを知りました。
val navController = findNavController(R.id.navHostFragment)
Navigation.setViewNavController(fabAdd, navController)
fabAdd.setOnClickListener {
navController.navigate(R.id.addSymbolFragment)
}
これにより、ナビゲーションが処理されます。次に、BottomAppBar
内のActivity
の可視性を制御する必要があります。
次のように、BottomAppBar
をMainActivity
に入れ、フラグメント内のFloatingActionButton
にアクセスできます。
_activity?.fab?.setOnClickListener {
/*...*/
findNavController().navigate(R.id.action_firstFragment_to_secondFragment, mDataBundle)
}
_
次のように、BottomAppBar
を別のアクティビティから非表示にすることができます
_(activity as AppCompatActivity).supportActionBar?.hide()
_
前のフラグメントに戻るときは、必ず.show()
BottomAppBar
を実行してください
何らかの理由で最初に特定のフラグメント(スターフラグメントではない)に移動したい場合、および1つのアクティビティのグラフを作成する必要がある場合は、次のように提案します。このメソッドはアクティビティを開始します。
companion object {
const val REQUEST_OR_CONFIRM = "request_or_confirm"
const val IS_JUST_VIEW = "IS_JUST_VIEW"
const val MODEL = "model"
fun open(activity: Activity, isRequestOrConfirm: Boolean, isJustView: Boolean = false, model: DataModel? = null) {
val intent = Intent(activity, HostActivity::class.Java)
intent.putExtra(REQUEST_OR_CONFIRM, isRequestOrConfirm)
intent.putExtra(IS_JUST_VIEW, isJustView)
intent.putExtra(MODEL, model)
activity.startActivity(intent)
}
}
次に、ホストアクティビティのonCreateメソッドで、最初に使用するグラフを決定してから、インテントエクストラバンドルを渡して、開始フラグメントが何をするかを決定できるようにします。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_purchase_nav)
if (intent.getBooleanExtra(REQUEST_OR_CONFIRM, true)) {
findNavController(R.id.nav_Host_fragment).setGraph(R.navigation.nav_first_scenario, intent.extras)
} else {
findNavController(R.id.nav_Host_fragment).setGraph(R.navigation.nav_second_scenario, intent.extras)
}
}
開始フラグメントで何をするかを決定する方法は次のとおりです。
if (arguments != null && arguments!!.getBoolean(HostActivity.IS_JUST_VIEW)){
navigateToYourDestinationFrag(arguments!!.getParcelable<DataModel>(HostActivity.MODEL))
}
次に、通常どおりにナビゲートします。
private fun navigateToYourDestinationFrag(model: DataModel) {
val action = StartFragmentDirections.actionStartFragmentToOtherFragment(model)
findNavController().navigate(action)
}
最初に3番目のフラグメントにジャンプしたい場合のグラフの外観は次のとおりです
PS:3番目のフラグメントで戻るボタンを処理することを確認してください ここ は解決策です
[〜#〜] update [〜#〜]:EpicPandaForceが述べたように、ナビゲーションコンポーネントを使用してアクティビティを開始することもできます。これを行うには、最初に+アイコン(私には機能しませんでした)または手動でxmlを追加することによる、既存のグラフへのアクティビティ:
<activity
Android:id="@+id/secondActivity"
tools:layout="@layout/activity_second"
Android:name="com.amin.SecondActivity" >
</activity>
navArgs()を使用して、引数を追加し、フラグメントの場合と同じように使用することもできます。
<activity
Android:id="@+id/secondActivity"
tools:layout="@layout/activity_second"
Android:name="com.amin.SecondActivity" >
<argument
Android:name="testArgument"
app:argType="string"
Android:defaultValue="helloWorld" />
</activity>
koltinでは、引数の使用方法は次のとおりです。まず、アクティビティにちなんで名付けられた生成されたクラスのタイプでargsを宣言します。この場合は、アクティビティクラスの先頭にあるSecondActivityArgsです。
val args: SecondActivityArgsby by navArgs()
そして、あなたはそれをこのように使うことができます:
print(args.testArgument)
MainActivityに配置し、アクティビティのonStart()
にsetOnClickListenerを配置すると、正常に動作します。
override fun onStart() {
super.onStart()
floatingActionButton.setOnClickListener {
it.findNavController().navigate(R.id.yourFragment)
}
}
注:このソリューションはハックのようなものであり、アクティビティが対話する準備ができたら、アクティビティライフサイクルに従ってOnClickListenerを設定することをお勧めします。