简体   繁体   English

运行Android 5.1的OnePlus One上的getSupportActionBar()上的NPE

[英]NPE at getSupportActionBar() on OnePlus One Running Android 5.1

My user who's using OnePlus One (A0001) running Android 5.1 reported this error: 我的使用运行Android 5.1的OnePlus One(A0001)的用户报告了此错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v7.app.ActionBar android.support.v7.app.ActionBarActivity.getSupportActionBar()' on a null object reference
    at com.imincode.meniti.MenuHome.onCreateOptionsMenu(MenuHome.java:558)
    at android.support.v4.app.Fragment.performCreateOptionsMenu(Fragment.java:2044)

Line 558 in my code is: 我的代码中的558行是:

ActionBar actionBar = ((ActionBarActivity)getActivity()).getSupportActionBar();

Apparently he's the only one with this problem. 显然他是唯一一个遇到这个问题的人。 Other devices never encountered such error. 其他设备从未遇到过此类错误。 How do I fix this? 我该如何解决?

This solution suggests we use 该解决方案建议我们使用

if (getSupportActionBar() != null)
{
   getSupportActionBar().setDisplayShowHomeEnabled(true);
}

but then how would the actionBar behaves on devices that returns null? 但是在返回null的设备上,actionBar的行为如何? How do we set setDisplayShowTitleEnabled and setDisplayHomeAsUpEnabled on such devices? 我们如何在此类设备上设置setDisplayShowTitleEnabled和setDisplayHomeAsUpEnabled?

In my OnCreateView, I have this line: 在我的OnCreateView中,有以下一行:

toolbar = (Toolbar) (getActivity()).findViewById(R.id.tool_bar); 
if (toolbar != null) {
   ((ActionBarActivity)getActivity()).setSupportActionBar(toolbar);
}

Btw here's the full stack trace: 顺便说一下,这是完整的堆栈跟踪:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v7.app.ActionBar android.support.v7.app.ActionBarActivity.getSupportActionBar()' on a null object reference
    at com.imincode.meniti.MenuHome.onCreateOptionsMenu(MenuHome.java:558)
    at android.support.v4.app.Fragment.performCreateOptionsMenu(Fragment.java:2044)
    at android.support.v4.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:2063)
    at android.support.v4.app.FragmentController.dispatchCreateOptionsMenu(FragmentController.java:270)
    at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:263)
    at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276)
    at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79)
    at android.support.v7.widget.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:49)
    at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:459)
    at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:69)
    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:5278)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:375)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

It is likely that you are using a theme that has no ActionBar, while you are not using ToolBar as well. 您可能正在使用没有ActionBar的theme ,同时也没有使用ToolBar

If you want to use ActionBar, check your theme 如果要使用ActionBar,请检查您的theme

If you are using ToolBar, you have to call setSupportActionBar(toolbar) before calling getSupportActionBar() 如果使用的是ToolBar,则必须在调用getSupportActionBar()之前先调用setSupportActionBar(toolbar) getSupportActionBar()

Edit: 编辑:

According to your edit, your Toolbar is inside layout of Fragment , 根据您的修改,您的工具栏位于Fragment布局内,

To solve your problem, use one of these methods: 要解决您的问题,请使用以下方法之一:

  1. Move your toolbar to layout of Activity and call setSupportActionBar in onCreate of Activity ; toolbar移动到Activity布局,并在Activity onCreate中调用setSupportActionBar Or 要么
  2. Do not use setSupportActionBar or getSupportActionBar or anything related to ActionBar , use Toolbar as Toolbar, eg call toolbar.inflateMenu to inflate menu 不要使用setSupportActionBargetSupportActionBar或与ActionBar相关的任何东西,而setSupportActionBar Toolbar用作Toolbar,例如,调用toolbar.inflateMenu来膨胀菜单

Edit 2 编辑2

Looking at your stack trace, 查看您的堆栈跟踪,

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v7.app.ActionBar android.support.v7.app.ActionBarActivity.getSupportActionBar()' on a null object reference

It is caused by getActivity() returning null. 这是由getActivity()返回null引起的。

Seems you are trying to call getActivity() in Fragment#onCreateOptionMenu , you should not try to access Activity in the method. 似乎您正在尝试在Fragment#onCreateOptionMenu调用getActivity() ,因此不应尝试在该方法中访问Activity

Move those methods really need Activity to onActivityCreated instead. 移动这些方法实际上需要将Activity改为onActivityCreated

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM