在 Fragment 中隐藏状态栏

4

我想在一个片段中隐藏状态栏。 我已经成功地隐藏了工具栏,但是我也想只在一个片段中隐藏状态栏。

  @Override
    public void onCreate(Bundle arg0) {
        super.onCreate(arg0);

   // requestWindowFeature(Window.FEATURE_NO_TITLE);

        ((HomeActivity)getActivity()).getSupportActionBar().hide();
    }

上述代码可以成功隐藏工具栏。
  requestWindowFeature(Window.FEATURE_NO_TITLE);

如果我在片段的onCreate中使用requestWindowFeature(如上所述),应用程序会崩溃。
在@Mathan Chinna的答案实施后,添加了三个截图:
1. 正常屏幕

Normal Screen

  1. 在实现 @Mathan Chinna 的代码之后

code from mathan chinna

  1. 当我从全屏模式回来时

When I come back from full screen

3个回答

8

虽然这只是我项目中的复制粘贴,但这种方法可以在片段中隐藏状态栏。

 private int currentApiVersion;       
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        getActivity().getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        currentApiVersion = android.os.Build.VERSION.SDK_INT;
        final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_FULLSCREEN    
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        if(currentApiVersion >= Build.VERSION_CODES.KITKAT) {
            getActivity().getWindow().getDecorView().setSystemUiVisibility(flags);
            final View decorView = getActivity().getWindow().getDecorView();
            decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
                @Override
                public void onSystemUiVisibilityChange(int visibility) {
                    if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                        decorView.setSystemUiVisibility(flags);
                    }
                }
            });
        }
        return inflater.inflate(R.layout.yourLayout, container, false);
    }

记住这段代码应该复制到你的Fragment类中,而不是任何方法中。
是的,你可以只使用下面的代码:
getActivity().getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
                View.SYSTEM_UI_FLAG_FULLSCREEN);

谢谢!您的代码适用于MarshMallow……就我对较低和较高版本的关注而言,我想问一下......这能在15 API到27 API上运行吗? - lizzy sam
如何再次显示状态栏?我无法在另一个片段中再次显示它。 请查看我编辑过的三张图片。 - lizzy sam
1
当我使用你建议的代码时,我的状态栏变成了灰色,而不是全屏图像。 - Niels Vanwingh
是的,我也遇到了灰色状态栏。 - Abraham Mathew
1
对我不起作用(API 30),它使状态栏变白。 - Abdullah
即使我得到了白色状态栏..如何修复这个问题? - user15919016

5

@Lalit Singh Fauzdar的答案是正确的,如果您想显示状态栏,可以使用

View decorView = getActivity().getWindow().getDecorView(); // Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(uiOptions);

-2

希望这段代码能对你有所帮助。

来自活动...

public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

   // YOUR FRAGMENT
   FragmentManager fragmentManager = getSupportFragmentManager();
   FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
   fragmentTransaction.replace(R.id.fragment_container, fragment,fragment.toString());
   fragmentTransaction.commit();

    }
public void HideStatusBar() {
   this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  }
public void ShowStatusBar() {
    this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  }
}

来自片段..

public class FragmentOne extends Fragment{

private Activity mActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


 ((MainActivity) getActivity()).HideStatusBar();
   }
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.mActivity = activity;

}
@Override
public void onDetach() {
    super.onDetach();
    this.mActivity = null;
}
@Override
public void onDestroyView() {
    super.onDestroyView();
    if (mActivity!=null){
       ((MainActivity) getActivity()).ShowStatusBar();
    }
}
 }

HideStatusBar() 我需要在片段的 onCreate 方法中调用这个方法吗? - lizzy sam
如果您认为我的回答对您有帮助,请考虑接受它。谢谢! - Mathan Chinna
你的代码只是隐藏了ActionBar......而这件事情可以通过 getActionBar().hide() 方法来实现。 - lizzy sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接