Android Studio Logcat错误解析:应用启动崩溃问题排查
问题:Android应用启动就崩溃,提示找不到菜单项的onClickHandler方法
为啥会崩溃呢?(给5岁小孩版解释)
想象一下:你告诉妈妈“帮我拿那个红色的杯子”,结果妈妈给你拿了个蓝色的碗——不是你要的,妈妈就懵了,没法继续。你的App现在就是这个情况:
你在菜单的XML文件里,给某个菜单项(比如nav_chat)加了个指令:“点击我就调用onClickHandler方法”。但App系统规定,菜单点击的方法必须拿一个叫MenuItem的“小物件”当参数,可你写的onClickHandler拿的是View这个“小物件”——系统找不到它要的那个方法,直接就崩溃啦!
怎么修复?有两种简单办法:
办法一:把你的方法改成系统要的样子
把你写的onClickHandler方法的参数换掉,从View view改成MenuItem item,这样系统就能认出来了:
// 修改前的错误方法 // public void onClickHandler(View view) { // switch (view.getId()) { // case R.id.nav_chat: // ... // } // } // 修改后的正确方法 public void onClickHandler(MenuItem item) { switch (item.getItemId()) { // 这里也要改成item.getItemId()哦 case R.id.nav_chat: paintView = (PaintView) findViewById(R.id.paintView1); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); paintView.init(metrics); break; } }
办法二:用你已经写好的代码(更推荐!)
你其实已经写了一个处理菜单点击的方法onNavigationItemSelected啦!完全可以把初始化paintView的逻辑移到这个方法里,然后删掉菜单XML里的android:onClick="onClickHandler"这句话,这样代码更整齐,也不会出错:
@Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.nav_message: getSupportFragmentManager().beginTransaction().replace( R.id.fragment_container, new MessageFragment()).commit(); break; case R.id.nav_chat: getSupportFragmentManager().beginTransaction().replace( R.id.fragment_container, new ChatFragment()).commit(); // 把原来onClickHandler里的代码移到这里! paintView = (PaintView) findViewById(R.id.paintView1); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); paintView.init(metrics); break; // 其他case保持不变... } drawer.closeDrawer(GravityCompat.START); return true; }
然后记得去你的菜单XML文件(比如navigation_menu.xml或者activity_main.xml里的菜单部分),找到带有android:onClick="onClickHandler"的菜单项,把这个属性删掉就行啦。
内容的提问来源于stack exchange,提问作者Dan Morrissey
相关产品推荐
相关产品推荐

