web-dev-qa-db-ja.com

ナビゲーションアーキテクチャコンポーネントでフラグメントを追加(置き換えない)

製品リストフラグメントと他の多くのフラグメントを含むアクティビティがあり、アーキテクチャコンポーネントのナビゲーションコントローラーを使用しようとしています。

問題は、(開始宛先)製品リストのフラグメントを置き換え、ユーザーが[戻る]ボタンをクリックしたときにリストがリロードされないようにすることです。

置換ではなく追加としてフラグメントトランザクションを作成する方法。

38
mohamed Shater

addおよびフラグメントトランザクションのその他のオプションを待機しているときに同じ問題に直面しました。

バインディングが存在するかどうかのチェックを追加し、ネットワークコールと同じように以前の状態を復元するだけです。ビューモデルにデータが存在するかどうかのチェックを追加し、ネットワークの再フェッチを実行しません。テスト後、期待どおりに動作します。

[〜#〜] edit [〜#〜]:リサイクルビューでは、フラグメントから移動する前のリストと同じ状態に自動的に戻ると思いますが、onSavedInstanceSateも可能です

  private lateinit var binding: FragmentSearchResultsBinding

  override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        viewModel =
            ViewModelProviders.of(this, mViewModelFactory).get(SearchResultsViewModel::class.Java)
        return if (::binding.isInitialized) {
            binding.root
        } else {
            binding = DataBindingUtil.inflate(inflater, R.layout.fragment_search_results, container, false)

            with(binding) {
               //some stuff
                root
            }
        }
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //reload only if search results are empty
        if (viewModel.searchResults.isEmpty()) {
           args.searchKey.let {
                binding.toolbarHome.title = it
                viewModel.onSearchResultRequest(it)
            }
        }
    }
3
Rainmaker

Androidナビゲーションコンポーネントは単に置換されますが、ダイアログのような置換の代わりにフラグメントを追加したい場合、これを使用できますが、最小化する必要があります。 「バージョン2.1.」(ナビゲーションコンポーネント用)。

ソリューション

ダイアログの宛先」が表示されます

3
UtkuKUTLU

少し検索した後は不可能ですが、問題自体はviewmodelとlivedataまたはrxjavaで解決できます。そのため、トランザクションの後でフラグメントの状態が保持され、製品リストが毎回リロードされません

0
Mohamed Shater

@Rainmakerは私の意見では正しいです、私は同じことをしました。リストフラグメントに戻ったときに同じリサイクラービューの位置に戻るために、リサイクラービューの位置/状態をonSaveInstanceStateに保存することもできます。

0
user3193413