NavigationView SwitchCompat 按钮只有在被选中时才有效

NavigationView SwitchCompat button only works when it is selected

在我的代码中,我有一个位于 NavigationView 中的 SwitchCompat 按钮,它应该在 SharedPreferences 中存储一些值。该按钮有效,但为了使其正常工作,必须首先选择它,即。您必须先单击按钮的文本,然后再单击开关本身。我找不到发生这种情况的原因。我的代码如下所示:

**MainActivity.kt**

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

... // onCreate(), etc

 override fun onNavigationItemSelected(item: MenuItem): Boolean {

        when (item.itemId) {
            R.id.srch_view -> Toast.makeText(applicationContext, "First", Toast.LENGTH_SHORT).show()
            R.id.switch_lay -> saveValues()

        }
        drawer_layout.closeDrawer(GravityCompat.START)
        return true
    }
...// rest of code

fun saveValues() {
        val btn = navView.findViewById<NavigationView>(R.id.navView)
        val compoundBtn: SwitchCompat =  btn.findViewById(R.id.switch_btn)
        prefs = getPreferences(Context.MODE_PRIVATE)
        editor = prefs.edit()
        mDarkTheme = prefs.getBoolean("isChecked", false)
        compoundBtn.setOnCheckedChangeListener { _, isChecked ->
                if (isChecked) {
                    // The toggle is enabled
                    editor.putBoolean("isChecked", true)
                    editor.apply()
                    Log.e("PREFS ", "SAVED ")
                } else {
                    // The toggle is disabled
                    editor.putBoolean("isChecked", false)
                    editor.apply()
                    Log.e("PREFS ", "NOT SAVED ")
              }
          }
      }
...
}

注意:该按钮可以工作,唯一的问题是必须选中它才能正常工作。有人帮忙就好了

好吧,我终于明白这是怎么回事了。我在单独的 .xml 中将 SwitchCompat 声明为 CompoundButton,它位于 ConstraintLayout 内。我删除了 ConstraintLayout 并将按钮的布局切换为 MenuItem。 最后,它看起来像这样:

MainActivity.kt

...
var mSwitchBtn: CompoundButton
var mSwitchItem: MenuItem
var mNavView: NavigationView

...

mSwitchItem= mNavView.menu.findItem(R.id.switch_theme)
mSwitchBtn= mSwitchItem.actionView as CompoundButton

mToggleAnim.setOnCheckedChangeListener { buttonView, isChecked -> 

// Rest of code
}