我正在尝试在操作栏中放置一个通知计数器,它在onCreateOptionsMenu
方法中给出了这个错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.widget.RelativeLayout.findViewById(int)' on a null object reference
at ro.oce.store.MainActivity.onCreateOptionsMenu(MainActivity.java:112)
at android.app.Activity.onCreatePanelMenu(Activity.java:2823)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:262)
at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:241)
at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:448)
at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:65)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
以下是代码:
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
RelativeLayout badgeLayout = (RelativeLayout) menu.findItem(R.id.shopping_cart).getActionView();
TextView tv = (TextView) badgeLayout.findViewById(R.id.actionbar_notifcation_textview);
tv.setText("12");
return true;
}
在我添加最后3行代码之前,我的应用程序没有生成任何错误。有人可以帮帮我吗?
答案 0 :(得分:0)
两个建议:
带走" badgeLayout"通过id - (TextView)findViewById();
检查布局是否为空,错误"空对象引用",表示调用实例为空。所以在这种情况下" badgeLayout"一片空白。执行以下操作:
- >检查您引用的布局xml是否存在。
- >删除getActionView()
答案 1 :(得分:0)
我建议将活动中的引用保存到您在onCreateOptionsMenu
中收到的Menu对象,然后使用它来检索需要在需要时进行更改的MenuItem
。例如,您可以按照以下方式执行某些操作:
在actionbar_notifcation
中制作menu.xml
项。
在你的活动中。
public class YourActivity extends Activity {
private Menu menu;
private String inBedMenuTitle = "Set to 'In bed'";
private String outOfBedMenuTitle = "Set to 'Out of bed'";
private boolean inBed = false;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Create your menu...
this.menu = menu;
getMenuInflater().inflate(R.menu.options, menu);
return true;
}
private void updateMenuTitles() {
MenuItem bedMenuItem = menu.findItem(R.id.actionbar_notifcation);
bedMenuItem.setTitle("12");
}
}
或者,您可以覆盖onPrepareOptionsMenu
以在每次显示菜单时更新菜单项。