Android Fragments 活动重叠?我找了很长时间,但还是不能解决这个问题

4ktjp1zp  于 11个月前  发布在  Android
关注(0)|答案(1)|浏览(87)

我将对这一问题解释如下:我从首页点击搜索框进入搜索界面。搜索界面通过hide和show方法显示两个片段。当我第一次进入时,显示了标记界面。搜索特定内容时,标签界面隐藏,搜索详情界面通过show()显示。现在,问题是,当我快速进入搜索界面并立即返回,然后再次快速点击搜索框试图进入搜索界面时,搜索界面无法正常显示,主屏幕仍然显示,无法进行任何操作。只有将屏幕滑回,我才能正常操作。通过日志可以看到,搜索界面确实已经打开,但无法显示。我试图搜索相关问题,但没有解决问题。请帮帮我,谢谢。
这是我的代码。

class SearchActivity : BaseVmActivity<SearchViewModel>() {

    companion object {
        private const val HISTORY_FRAGMENT_TAG = "history_fragment"
        private const val RESULT_FRAGMENT_TAG = "result_fragment"

        fun instance(): SearchActivity {
            return SearchActivity()
        }
    }

    private lateinit var historyFragment: HistoryFragment
    private lateinit var resultFragment: ResultFragment

    override fun viewModelClass(): Class<SearchViewModel> = SearchViewModel::class.java

    override fun getLayoutId(): Int = R.layout.activity_search

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        println("出事了")
        if (savedInstanceState == null) {
            historyFragment = HistoryFragment.instance()
            resultFragment = ResultFragment.instance()
            supportFragmentManager.beginTransaction()
                .add(R.id.container, historyFragment, HISTORY_FRAGMENT_TAG)
                .add(R.id.container, resultFragment, RESULT_FRAGMENT_TAG)
                .show(historyFragment)
                .hide(resultFragment)
                .commit()
        } else {
            historyFragment = supportFragmentManager.findFragmentByTag(HISTORY_FRAGMENT_TAG) as HistoryFragment
            resultFragment = supportFragmentManager.findFragmentByTag(RESULT_FRAGMENT_TAG) as ResultFragment
            println("执行了吗")
        }

        imgBack.setOnClickListener {
            if (resultFragment.isVisible) {
                supportFragmentManager.beginTransaction()
                    .hide(resultFragment)
                    .commit()
            } else {
                println("触发了")
                supportFragmentManager.beginTransaction().remove(historyFragment)
                    .remove(resultFragment).commit()
                ActivityHelper.finish(SearchActivity::class.java)
            }
        }
        imgSearch.setOnClickListener {
            val text = etInput.text.toString().trim()
            if (text.isNotEmpty()) {
                resultFragment.doSearch(text)
                supportFragmentManager.beginTransaction()
                    .show(resultFragment)
                    .commit()
                it.hideSoftInput()
                historyFragment.addHistory(text)
            }
        }
        imgClear.setOnClickListener {
            etInput.setText("")
        }
        etInput.run {
            addTextChangedListener(
                onTextChanged = { text, _, _, _ ->
                    imgClear.isGone = text.isNullOrEmpty()
                }
            )
            setOnEditorActionListener { _, actionId, _ ->
                if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                    imgSearch.performClick()
                    true
                } else false
            }
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        supportFragmentManager.putFragment(outState, HISTORY_FRAGMENT_TAG, historyFragment)
        supportFragmentManager.putFragment(outState, RESULT_FRAGMENT_TAG, resultFragment)
    }

    override fun initView() {

    }

    fun fillInputText(content: String) {
        etInput.setText("")
        etInput.setText(content)
        etInput.setSelection(content.length)
    }

    override fun onBackPressed() {
        imgBack.performClick()
    }

    override fun onPause() {
        super.onPause()
        LogUtil.d("onPause")
    }

    override fun onStop() {
        super.onStop()
        LogUtil.d("onStop")
    }

    override fun onDestroy() {
        super.onDestroy()
        LogUtil.d("onDestroy")
    }
}

字符串
我想从首页进入搜索界面,返回首页,进入搜索界面。这个过程反复进行,始终是正常的

gpnt7bae

gpnt7bae1#

你应该调试这个并观察错过的视图。找到的意见,将被摧毁的麻烦的情况下,为什么它的做法?根据我的经验,当你在Fragment中下载视图时,你应该检查getContext()/getApplicationContext。它有助于检查,是你的片段渲染或用户关闭他.

相关问题