web-dev-qa-db-ja.com

FABをクリックしてフラグメントに移動します(ナビゲーションアーキテクチャコンポーネント)

新しいナビゲーションアーキテクチャコンポーネントを使用して、メイン画面(FloatingActionButtonBottomAppBarにアタッチされている)から別の画面に移動する方法がわかりませんなしアプリバー。

ファブをクリックすると、次の画面(フラグメント?)を右からスライドさせます。問題は、BottomAppBarをどこに置くかです。 MainActivityに入れると、FloatingActionButtonNavControllerが設定されていないという問題があります。また、BottomAppBarをフラグメントに入れることもできません。私は途方に暮れています。

7
Charlie Niekirk

今日この問題に遭遇しました、そして私はそれのためのシンプルでエレガントな解決策があることを知りました。

val navController = findNavController(R.id.navHostFragment)
Navigation.setViewNavController(fabAdd, navController)
fabAdd.setOnClickListener {
   navController.navigate(R.id.addSymbolFragment)
}  

これにより、ナビゲーションが処理されます。次に、BottomAppBar内のActivityの可視性を制御する必要があります。

1
Dariush Malek

次のように、BottomAppBarMainActivityに入れ、フラグメント内のFloatingActionButtonにアクセスできます。

_activity?.fab?.setOnClickListener { 
    /*...*/
    findNavController().navigate(R.id.action_firstFragment_to_secondFragment, mDataBundle)
}
_

次のように、BottomAppBarを別のアクティビティから非表示にすることができます

_(activity as AppCompatActivity).supportActionBar?.hide()
_

前のフラグメントに戻るときは、必ず.show()BottomAppBarを実行してください

2
Yaswant Narayan

何らかの理由で最初に特定のフラグメント(スターフラグメントではない)に移動したい場合、および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番目のフラグメントにジャンプしたい場合のグラフの外観は次のとおりです enter image description here

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)
0

MainActivityに配置し、アクティビティのonStart()にsetOnClickListenerを配置すると、正常に動作します。

override fun onStart() {
  super.onStart()
  floatingActionButton.setOnClickListener {
    it.findNavController().navigate(R.id.yourFragment)
   }
}

注:このソリューションはハックのようなものであり、アクティビティが対話する準備ができたら、アクティビティライフサイクルに従ってOnClickListenerを設定することをお勧めします。

同様の質問[解決済み]

0
Anmol