如何从 Android 上的片段访问 ActionBar

How access ActionBar from fragment on Android

在我的应用程序中,我只有一个 activity(扩展 ActionBarActivity )和各种片段(扩展片段)。 当用户单击菜单选项时,应用程序会更改 Fragment。 此时我想更改标题和 ActionBar 的背景颜色。 当我尝试 ActionBar actionBar = getActivity().getActionBar(); 时,我得到了一个空异常。

我正在使用支持库,并且在 Activity 我正在 android.support.v7.app.ActionBar actionBar = getSupportActionBar(); 成功使用。

关于片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.material_cadastro, container, false);

    viewHolder = new MaterialViewHolder(view);

    ActionBar actionBar = getActivity().getActionBar();
    actionBar.setTitle(R.string.inserir_material);

    return view;
}

调试我得到 Activity 返回正常,但 ActionBar 为空:

getActivity() = {br.com.americocarelli.vendasfacil.ui.MenuPrincipal@3b56766f}
getActivity().getActionBar() = null

既然你使用了支持库(ActionBarActivity),那么使用((ActionBarActivity)getActivity()).getSupportActionBar();来访问支持操作栏。

您可能正在使用 >=21 的构建工具构建它,该版本导致 activity.getActionBar() returns 无效,您应该改用 getSupportActionBar()。 编辑:如果您恰好在这一行获得 NPE:getActivity()。 ... 那么您可能在将片段附加到 activity 之前或之后引用它。您能否粘贴您正在使用它的上下文(位置,在什么功能中)?

覆盖你的 onAttach(Activity),然后将你的 Activity 转换为 ActionBarActivity,你可以获得 ActionBar。 喜欢:

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    ActionBar actionBar=((ActionBarActivity)activity).getSupportActionBar();
}