热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决MenuItem中通过app:actionLayout使用Switch时出现的空指针异常问题

在Android应用开发中,当在MenuItem中通过app:actionLayout属性使用Switch控件时,可能会遇到空指针异常的问题。本文将探讨该问题的原因及解决方案。

应用场景:

在开发过程中,为了实现更丰富的功能,有时需要在菜单项(MenuItem)中添加自定义视图,如Switch开关。这种情况下,通常会使用app:actionLayout属性来指定一个布局文件,该布局文件中包含所需的Switch控件。

xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:cOntext="com.example.nfcdemo.MainActivity">
android:id="@+id/action_open_close_nfc"
android:orderInCategory="100"
android:title=""
app:actiOnLayout="@layout/menu_switch"
app:showAsAction="always" />

上述代码中的menu_switch布局文件包含了Switch控件,其定义如下:


android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:id="@+id/switchForActionBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text=""
android:checked="false"
android:theme="@style/ThemeOverlay.SwitchBar" />

问题分析

如果直接使用findViewById()方法尝试从菜单项中获取Switch控件,由于MenuItem并未直接持有该控件,而是通过actionLayout间接引用,因此会导致空指针异常。

解决方案

正确的做法是首先通过menu.findItem()方法找到对应的MenuItem,然后调用getActionView()方法获取到设置的布局视图,最后在这个视图上使用findViewById()来定位到Switch控件。示例如下:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem switchItem = menu.findItem(R.id.action_open_close_nfc);
Switch mSwitch = (Switch) switchItem.getActionView().findViewById(R.id.switchForActionBar);
if (mNfcAdapter != null) {
mSwitch.setChecked(mNfcAdapter.isEnabled());
}
return true;
}


推荐阅读
author-avatar
手机用户2502939987
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有