屏幕旋转后,多个片段利用单个工具栏绘制菜单

时间:2019-01-30 15:34:45

标签: android android-fragments android-toolbar android-menu

该场景是下一个:  1.打开第一个声明为setHasOptionsMenu(true)的片段,从onViewCreated的布局中查找工具栏视图,然后通过AppCompatActivity的类接口(setSupportActionBar)将其设置为活动。此外,它会覆盖onCreateOptionsMenu,并设置与单个菜单SearchView。  2.使用用于打开第一个片段的相同活动FragmentManager打开第二个片段。重新设置所有与菜单有关的声明,但是在带有SearchView的菜单上,它仅包含带有图标的菜单。  3.更改设备方向(旋转)。然后,首先将恢复第一个片段,并调用其onViewCreated方法,其中AppCompatActivity将其Toolbar接收到setSupportActionBar方法中。然后,将为第二个片段调用相同的过程(所有这些操作都通过状态还原机制自动运行)。

当按下活动片段工具栏上的“后退”按钮时,正在运行淡出动画时,第一个片段的SearchView在此处可见,而路由返回完成的工具栏出现在第一个片段上片段,而不是SearchView(还有工具栏的后退按钮可以执行任何操作)。

当旋转设备背面的工具栏被正常充气。

这是第一个片段的代码:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    this.toolbar(
        toolbarId = R.id.toolbar_first_fragment,
        title = getString(R.string.first_fragment_title),
        textColor = android.R.color.black,
        indicatorColor = android.R.color.black
    )
    this.view = FirstFragmentView(view, savedInstanceState, childFragmentManager)
}

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    super.onCreateOptionsMenu(menu, inflater)
    menu?.clear()
    inflater!!.inflate(R.menu.menu_scenarios, menu)
}

override fun onPrepareOptionsMenu(menu: Menu?) {
    super.onPrepareOptionsMenu(menu)
    if (view.menuItem == null) {
        val menuItem: MenuItem = menu!!.findItem(R.id.action_search)
        val searchView: SearchView = menuItem.actionView!! as SearchView
        view.withSearchView(menuItem, searchView)
        addOnQueryListener(searchView)
        setSignalingExpandListener()
    }
}

第二个片段的代码:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    this.toolbar(
        indicatorColor = android.R.color.black,
        textColor = android.R.color.black,
        title = arguments!!.getString(KEY_CONTEXT)!!
    )
}

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater) {
    menu?.clear()
    inflater.inflate(R.menu.menu_scenario_details, menu)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if (item.itemId == R.id.settings_menu_item) {
        scenariosRoadmap.scenarioSettings()
        return true
    }
    return super.onOptionsItemSelected(item)
}

toolbar扩展方法:

fun Fragment.toolbar(
    toolbarId: Int = R.id.toolbar,
    title: CharSequence = "",
    textColor: Int = R.color.colorPrimary,
    backShown: Boolean = true,
    indicatorId: Int? = null,
    indicatorColor: Int = R.color.colorPrimary
) {
    val toolbar = this.view!!.findViewById<Toolbar>(toolbarId)
    compatActivity.setSupportActionBar(toolbar)
    activity!!.title = title
    val supportActionBar = compatActivity.supportActionBar
    supportActionBar!!.setDisplayHomeAsUpEnabled(backShown)
    if (indicatorId != null) {
        supportActionBar.setHomeAsUpIndicator(indicatorId)
    }
    toolbar.navigationIcon?.setColorFilter(ContextCompat.getColor(context!!, indicatorColor), PorterDuff.Mode.SRC_ATOP)
    toolbar.setTitleTextColor(ContextCompat.getColor(context!!, textColor))
}

val Fragment.compatActivity: AppCompatActivity
    get() = activity!! as AppCompatActivity

0 个答案:

没有答案