Android Studio中NavigationView空对象引用异常问题求助
你遇到的这个空指针问题,核心原因很明确:你在Activity加载布局之前就尝试获取控件实例了,此时布局还没被系统加载到内存里,findViewById自然返回null,调用它的方法就会抛出异常。
问题根源
看你onCreate方法的执行顺序:
// 先调用findViewById,但此时布局还没加载 dLayout = findViewById(R.id.drawer_layout); navView = (NavigationView) findViewById(R.id.navigation); navView.setNavigationItemSelectedListener(...); // 之后才加载布局 binding = ActivityAppBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot());
setContentView是告诉系统“把这个布局加载到当前Activity”的关键步骤,在这之前所有findViewById调用都会返回null,这就是触发异常的直接原因。
修复方案
把控件初始化和监听器设置的代码,移动到setContentView(binding.getRoot())之后。另外,既然你已经用了View Binding,推荐直接通过binding对象获取控件,这比手动findViewById更安全、更简洁。
修复后的onCreate核心代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 第一步:先加载布局 binding = ActivityAppBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // 第二步:现在可以安全获取控件了 dLayout = binding.drawerLayout; navView = binding.navigation; navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_SHORT).show(); // 额外优化:点击菜单后关闭抽屉,提升体验 dLayout.closeDrawer(GravityCompat.START); return true; } }); // 后续的地图、按钮初始化代码... SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); pop_button = binding.popButton; pop_button.setOnClickListener(...); }
额外提示
- View Binding会自动把XML里的下划线命名控件转换成驼峰命名(比如
drawer_layout变成drawerLayout),直接通过binding.xxx调用即可,彻底避免手动findViewById的出错可能。 - 记得在菜单点击事件里关闭抽屉,不然用户操作后抽屉会一直停留在界面上,影响使用体验。
内容的提问来源于stack exchange,提问作者Nenad Blagov
相关产品推荐
相关产品推荐

