关闭片段时如何正确关闭动作模式?

时间:2019-07-11 13:15:01

标签: android-fragments android-lifecycle android-actionmode

我正在尝试使用Kotlin开发适用于Android手机的应用程序,但是我遇到了片段生命周期,操作模式和视图模型的问题

我有一个MainActivity,NavigationView和一个FrameLayout来显示我所有的片段。 MainActivity仅在此处支持片段导航。

activity_main


        <FrameLayout
                android:id="@+id/activity_main_frame_layout"
                android:layout_width="match_parent"
                android:layout_height="match_parent">


        </FrameLayout>

    </LinearLayout>

    <!-- 2 | NavigationView -->
    <com.google.android.material.navigation.NavigationView
            android:id="@+id/activity_main_nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/activity_main_nav_header"
            app:menu="@menu/activity_main_menu_drawer" />

现在在我的MainActivity中,我显示第一个片段,让我们用这种方法将其称为FragmentA

val transaction : FragmentTransaction = supportFragmentManager.beginTransaction()
                .replace(R.id.activity_main_frame_layout, fragment)
            transaction.addToBackStack(name)
            transaction.commit()

此FragmentA是具有多个TextView的表单。 我有一个与FragmentA关联的SearchViewModel tewtView之一将用户发送到另一个片段,让我们使用此方法将他称为FragmentB:

FragmentA

private fun startCategoryFragment() {
        val searchCategoryFragment  = SearchCategoryFragment.newInstance()
        //val childragmentManager = getChildFragmentManager()

        val transaction : FragmentTransaction = activity!!
            .supportFragmentManager.beginTransaction()
            .replace(R.id.activity_main_frame_layout, searchCategoryFragment)
        transaction.addToBackStack(null)
        transaction.commit()

    }

 override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        mainSearchViewModel = ViewModelProviders.of(activity!!).get(MainSearchViewModel::class.java)
        mainSearchViewModel.getSelectedCategories().observe(viewLifecycleOwner, Observer { categorieList ->
            mCategoryInputText.text = categorieList.joinToString { it.name }
        })

    }

片段B用于在recyclerview中选择项目列表,因此当我单击某个项目时,会出现ActionMode

片段B

inner class ActionModeCallback : ActionMode.Callback {
        override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
            return false
        }

        override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
            return true
        }

        override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
            return true
        }

        override fun onDestroyActionMode(mode: ActionMode?) {
            Log.d("ActionmodeReceiver", "onDestroyActionMode Called")
            catListAdapter?.clearSelected()
            actionMode = null
        }
    }

很抱歉,冗长的解释,但是现在我认为您已经掌握了一切。这是问题所在。 这是片段B中我的验证按钮的代码

......
fabValidate.setOnClickListener {
            searchViewModel.setSelectedCategories(catListAdapter.selectedValues)
            closeFragment()
        }
.......

private fun closeFragment(){
       actionMode?.finish()
        activity!!.supportFragmentManager.popBackStack()
    }

问题在于: 当我单击我的验证按钮时,片段B被破坏了,但是片段A中的观察者却得到了emptyList。 如果我在片段B中注释此行

//actionMode?.finish()

我的列表不是空的,但是我的工具栏上仍然显示了我的操作模式。

我想我面临一个生命周期问题,即我的B片段被破坏了,但是我正在解决这个问题。

0 个答案:

没有答案