在片段中隐藏或显示ActionBar的正确位置

时间:2014-04-17 03:41:40

标签: android android-fragments android-actionbar

我的应用中有几个地方需要隐藏或显示操作栏,问题是我仍然不确定隐藏或显示片段上ActionBar的最佳位置。< / p>

我只有一个活动和几个不同的片段,其中一些我需要完全隐藏ActionBar,我成功了但是我担心这个ActionBar实际上是这样的附加到父活动(过去我得到了一些NullPointerException ...)。

所以我的问题是,当添加片段时,我应该在哪里隐藏或显示我的ActionBar,当删除相同的片段时,我应该在哪里隐藏或显示它?

目前我正考虑将其隐藏在OnActivityCreated中,然后将其显示在onDetach中,但我担心如果出现任何错误,ActionBar会保持隐藏状态发生在片段中(因此不会调用onDetach)。

更新:我必须在我的代码中执行此操作,以避免在我的片段onStart方法上使用空指针:

@Override
public void onStart(){
    super.onStart();

    //if the actionbar exists
    if(getActivity().getActionBar() != null){
        getActivity().getActionBar().hide();
    }
}

UPDATE2

我尝试使用onAttachrequestFeature() must be called before adding content时遇到此异常。这个错误发生在屏幕旋转期间,我认为原因是我没有使用setRetainInstance并且该片段正在尝试在重新启动时由于配置更改而向主活动添加内容。

为了解决这个问题,我将代码放在onActivityCreated中,我想我现在只会将其放在那里,并使用onDetachonDestroy来显示{ {1}}再次。

3 个答案:

答案 0 :(得分:1)

我在一个项目中有相同的要求,我可以使用ActionBarFragment方法在onAttach内隐藏/显示onDestroy而不会给您带来任何不便。然后,我在创建片段时使用它隐藏动作栏:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    getActivity().getActionBar().hide();
}

这一点,当它被删除时:

@Override
public void onDestroy() {
    super.onDestroy();
    getActivity().getActionBar().show();
}  

在相同的方法中,我还能够addFlagsclearFlags以全屏模式制作片段。它运作良好。如果这有帮助,请告诉我。

答案 1 :(得分:1)

Hide附加到Fragment时,最佳方法是Activity。因此,FragmentActivity

相关联的实际位置
public void onAttach(Activity activity) {}

ShowFragment

分离后,Activity又回来了
public void onDetach() {}

注意:通过设置onDestroy()重新训练片段实例时,不会调用setRetainInstance

答案 2 :(得分:0)

如果您使用v4支持库,这是唯一的方法。

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    ((ActionBarActivity) getActivity()).getSupportActionBar().hide();
}
@Override
public void onDestroy() {
    super.onDestroy();
    ((ActionBarActivity) getActivity()).getSupportActionBar().show();
}