Android Kotlin如何处理导航抽屉中的Switch开关按钮
该问题核心原因:NavigationView中通过app:actionLayout添加的自定义控件不属于Activity直接布局层级,无法直接通过Activity的findViewById获取,需要先绑定到对应菜单项的actionView上再查找实例,具体实现如下:
1. 修正自定义开关布局的冗余声明
原有开关布局文件重复声明了xmlns:android命名空间,删掉重复行即可,修正后代码:
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mySwitchID" android:layout_width="wrap_content" android:layout_height="match_parent" android:padding="64dp" android:checked="true" />
菜单XML文件无需修改,保持原有配置即可。
2. MainActivity中获取控件实例+实现交互逻辑
核心逻辑是先通过NavigationView的menu找到对应菜单项,再从菜单项的actionView中查找SwitchCompat实例,完整可运行代码如下:
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding lateinit var toggle : ActionBarDrawerToggle override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val drawerLayout : DrawerLayout = findViewById(R.id.drawerLayout) val navView : NavigationView = findViewById(R.id.nav_view) toggle = ActionBarDrawerToggle(this,drawerLayout,R.string.open,R.string.close) drawerLayout.addDrawerListener(toggle) toggle.syncState() supportActionBar?.setDisplayHomeAsUpEnabled(true) // ========== 开关获取+交互核心逻辑 ========== // 定位通知功能对应的菜单项 val notificationItem = navView.menu.findItem(R.id.notifications) // 从菜单项的自定义布局中获取SwitchCompat实例 val notificationSwitch = notificationItem.actionView.findViewById<SwitchCompat>(R.id.mySwitchID) // 监听开关状态变化 notificationSwitch.setOnCheckedChangeListener { _, isChecked -> // 在此处编写通知开关的业务逻辑:比如持久化存储开关状态、启停推送通道 // isChecked为true代表开启通知,false代表关闭通知 } // 菜单项点击监听 navView.setNavigationItemSelectedListener { when(it.itemId){ R.id.notifications -> { // 点击菜单项整行时切换开关状态,优化交互体验 notificationSwitch.isChecked = !notificationSwitch.isChecked // 可选配置:点击后自动关闭导航抽屉 drawerLayout.closeDrawers() } // 其余菜单项的逻辑按原有方式编写即可 R.id.myFavourites -> {} R.id.rateUs -> {} R.id.item4 -> {} R.id.item5 -> {} R.id.item6 -> {} R.id.item7 -> {} } true } } override fun onOptionsItemSelected(item: MenuItem): Boolean { if(toggle.onOptionsItemSelected(item)){ return true } return super.onOptionsItemSelected(item) } }
实现效果

注:截图中“Bildirimler”为土耳其语,含义为“通知”
内容的提问来源于stack exchange,提问作者Ugur
相关产品推荐
相关产品推荐

