【问题标题】:NullPointerException when referencing toolbar in fragment在片段中引用工具栏时出现 NullPointerException
【发布时间】:2016-03-17 08:58:29
【问题描述】:

我在我的活动中添加了一个工具栏,并试图在我的片段中访问它以更改后退导航的标题和图标,但是我一直收到错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference

当我运行我的应用程序以及一些关于可能对象为空的警告。我知道这与getsupportactionbar 有关 但是我无法弄清楚我做错了什么

这里是在activity中声明工具栏的代码

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

片段中工具栏的引用和更改代码

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);

以及在xml中声明工具栏的代码

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorAccent"
    android:layout_alignParentTop="true"
    app:popupTheme="@style/AppTheme.PopupOverlay" />

如果有帮助,我正在使用appcompatactivity

【问题讨论】:

    标签: android android-fragments android-appcompat android-toolbar


    【解决方案1】:

    我认为问题在于您在视图膨胀之前访问工具栏导致NullPointerException。而且由于您使用的是支持库,因此您需要将工具栏转换为android.support.v7.widget.Toolbar。这是一个可能有帮助的解决方案:

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) rootView.findViewById(R.id.toolbar);
            ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
            ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);    
    
            return rootView;
    }
    

    【讨论】:

    • 如果他有import android.support.v7.widget.Toolbar;,那么投射(Toolbar)(android.support.v7.widget.Toolbar) 相同......但是你是对的
    • 感谢您的回答,我在视图膨胀后调用它,但是,我收到错误 cannot resolve method for setHomeAsUpEnabled,我不能在片段中执行此操作吗?
    • @AlHennessey 我更新了我的代码并在 Android Studio 中对其进行了测试,但没有收到任何错误。请尝试编辑
    • 您好,感谢您的帮助,我更新了代码,但在 displayShowHomeEnabled 行出现空指针异常。但是,如果我离开 android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) rootView.findViewById(R.id.toolbar);setSupportActionBar 线,后退按钮会出现,但是按下时它不会做任何事情
    • 通过在创建活动中设置SetDisplayHomeAsUpEnabled 解决它,然后使用((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Login"); 之类的行在活动中更改它。为了解决按钮不执行任何操作的问题,我将OnBackPressed 行添加到OnOptionsItemSelected 感谢您的帮助
    【解决方案2】:

    ((Activity)getActivity()).setSupportActionBar(toolbar);

    【讨论】:

    • Activity 没有方法getSupportActionBar()
    【解决方案3】:

    修改这个:

    Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
    ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);
    

    到这里:

    Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
    toolbar.setDisplayShowHomeEnabled(true);
    getActivity().setSupportActionBar(toolbar);
    

    希望对你有帮助!!!

    【讨论】:

    • 然后NPE将从toolbar.setDisplayShowHomeEnabled(true);线抛出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多