NullPointerException:尝试在空对象引用上调用虚方法'android.view.View android.widget.RelativeLayout.findViewById(int)'

时间:2015-09-17 08:34:15

标签: java android nullpointerexception

我正在尝试在操作栏中放置一个通知计数器,它在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行代码之前,我的应用程序没有生成任何错误。有人可以帮帮我吗?

2 个答案:

答案 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以在每次显示菜单时更新菜单项。