首页 > 解决方案 > Android / Kotlin - 通过按下导航菜单按钮失去对文本字段的关注后,片段未附加到活动

问题描述

我的 Android 应用程序有问题。

我有一个作为可编辑文本视图列表生成的片段。每个 textview 都有一个setOnFocusChangeListener调用服务器上的 API。 FocusChangedListener在最后一个 textview 上正常工作,之后我的 textview 保持焦点,如下图所示。

在此处输入图像描述

问题

现在我必须通过单击右侧的菜单按钮来更改菜单(片段)。当单击按钮并且即将加载新菜单时,我的 textview 失去焦点并调用 API,但我不希望我的应用程序这样做。如果我单击菜单按钮是因为我必须更改它并且我希望我的旧片段消失或基本上不执行 FocusChangedListener。

在此处输入图像描述

有任何想法吗?

标签: androidkotlinandroid-fragmentstextviewlost-focus

解决方案


我做了一个小技巧来解决这个问题。我刚刚在我的 DrawerMenu 的 OnCreate 中添加了这段代码,然后我设置了一个全局变量“ drawerOpened ”来每次检查我的菜单是否打开。

        // Initialize the action bar drawer toggle instance
    val drawerToggle:ActionBarDrawerToggle = object : ActionBarDrawerToggle(
        this,
        drawer_layout,
        toolbar,
        R.string.navigation_drawer_open,
        R.string.navigation_drawer_close
    ){
        override fun onDrawerClosed(view:View){
            super.onDrawerClosed(view)
            GlobalVar.drawerOpened = false
        }

        override fun onDrawerOpened(drawerView: View){
            super.onDrawerOpened(drawerView)
            GlobalVar.drawerOpened = true
            currentFocus?.clearFocus()  //clear focus - any view having focus
        }
    }

然后在我的 HomeFragment 中我这样做了:

// if GlobalVar.drawerOpened is false then setOnFocus

if (field.validatefield || field.nextpage != 0)
{
  textView.setOnFocusChangeListener { _, hasFocus ->
    if (!hasFocus && !GlobalVar.drawerOpened)
    {
        if ((field.mandatory && !textView.text.toString().isNullOrEmpty()) || (!field.mandatory)) {
            if (field.validatefield) {
                validateField(field.fieldcode, textView.text.toString(), field.nextpage)
            } else {
                _goToNextPageNo = field.nextpage
                goToNextPageIfExist()
            }
        }
    }
  }
}

这不是一个完整的解决方案,但它工作正常。


推荐阅读