android getSupportActionBar() returns 片段中为空

android getSupportActionBar() returns null in fragment

更新

我没有提到任何关于使用 ToolBar with ActionBarActivity. And that is the reason I always get null pointer exception. For those who face same problem


我有这个片段代码可以在片段更改时更改支持操作栏的外观。

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);
        mActionBar = ((ActionBarActivity)getActivity()).getSupportActionBar();
        SpannableString s = new SpannableString("Dashboard");
        s.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.app_blue_text)), 0, s.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        s.setSpan(new TypefaceSpan(getActivity(), "Optima-Regular.ttf"), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        if( null!= mActionBar){
            mActionBar.setElevation(0);
            mActionBar.setTitle(s);
        }
    }

我已经提到 previous/similar 有关如何解决此错误的问题。这些解决方案建议更改 onActivityCreated() 方法中的操作栏外观。我也试过onAttach()。 None 似乎有效。我使用支持操作栏来保持向后兼容性。 Activity 也相应地转换为 ActionBarActivity

完整代码相当冗长,所以我跳过了 post。如果需要,我可以 post 完成代码并使用更多详细信息更新问题。

错误日志

Caused by: java.lang.NullPointerException
            at com.example.testapp.fragments.NavigationDrawerFragment.onActivityCreated(NavigationDrawerFragment.java:215) 

第 215 行是:mActionBar.setElevation(0);

只需使用:

mActionBar = getActivity().getSupportActionBar();

或:

mActionBar = ((yourActivityName)getActivity()).getSupportActionBar();


[更新] 删除行 mActionBar.setElevation(0); 因为 setElevation 仅适用于 API 21+

我错过了在这个问题中提到的更多信息。这就是其他好的 SO 用户无法正确回答的原因。所以在这里我自己回答。

我用 ToolBar 代替了常规的 ActionBar。当您使用 ToolBar 时,您必须将其设置为 ActionBar。所以通过做 -

toolbar = (Toolbar) getActivity().findViewById(toolbarId);
((ActionBarActivity)getActivity()).setSupportActionBar(toolbar);

然后我可以通过 -

轻松更改标题和外观
((ActionBarActivity)getActivity()).getSupportActionBar().setTitle(s);

在fragment中实际使用actionbar之前记得将toolbar设置为actionbar。