在片段中引用工具栏时出现 NullPointerException

NullPointerException when referencing toolbar in fragment

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

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

当我 运行 我的应用程序以及一些关于可能 object 为空的警告时。我知道这与 getsupportactionbar 有关 但是我不知道我做错了什么

这是在activity

中声明工具栏的代码
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

fragment中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

((Activity)getActivity()).setSupportActionBar(工具栏);

修改这个:

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);

希望对您有所帮助!!!

我认为问题在于您在视图 inflation 之前访问了工具栏,这导致了 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;
}