从片段中隐藏 NavigationDrawer 和 ActionBar

Posted

技术标签:

【中文标题】从片段中隐藏 NavigationDrawer 和 ActionBar【英文标题】:Hide NavigationDrawer and ActionBar From Fragment 【发布时间】:2019-10-10 14:38:56 【问题描述】:

我试图。

我已经创建了以下接口并在活动中实现了相同的接口

  public interface CommonMethodsListener 
      void hideActionbar();
      void showActionbar();
      void setActionBarTitle(String title);
  

我在Activity中实现了以下方法。

  public void setDrawerEnabled(boolean enabled) 
      int lockMode = enabled ? DrawerLayout.LOCK_MODE_UNLOCKED :
              DrawerLayout.LOCK_MODE_LOCKED_CLOSED;
      drawer.setDrawerLockMode(lockMode);
      toggle.setDrawerIndicatorEnabled(enabled);
  

  @Override
  public void hideActionbar() 
      getSupportActionBar().hide();
      setDrawerEnabled(false);
  

  @Override
  public void showActionbar() 
      getSupportActionBar().show();
      setDrawerEnabled(true);
  

我在 Fragment 中调用hideActionBar()showActionBar(),如下所示

  @Override
  public void onResume() 
      super.onResume();
      mCommonMethodsListener.hideActionbar();
  

  @Override
  public void onPause() 
      super.onPause();
      mCommonMethodsListener.showActionbar();
  

我无法使用上述代码隐藏 ActionBar 和 NavigationDrawer。

我有两个片段,分别称为 SplashFragmentLoginFragment。我在两个片段中都调用了hideActionBar() 和'showActionBar()inonResume()andonPause()`。

SplashFragment 加载时没有 ActionBarNavigationDrawer。带有postDelayedHandler 将在预设延迟3000 毫秒后导航到LoginFragment

LoginFragment 出现 ActionBarNavigationDrawer

build.gradle 如下。

  android 
      compileSdkVersion 28
      defaultConfig 
          applicationId "io.azpire.ncloudpay"
          minSdkVersion 24
          targetSdkVersion 28
          versionCode 1
          versionName "1.0"
          testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
      
      buildTypes 
          release 
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
          
      
      dataBinding 
          enabled = true
      
  

  dependencies 
      implementation fileTree(dir: 'libs', include: ['*.jar'])
      implementation 'androidx.appcompat:appcompat:1.0.2'
      implementation 'androidx.legacy:legacy-support-v4:1.0.0'
      implementation 'com.google.android.material:material:1.0.0'
      implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
      implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
      testImplementation 'junit:junit:4.12'
      androidTestImplementation 'androidx.test:runner:1.1.1'
      androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
      implementation 'androidx.navigation:navigation-fragment:2.0.0'
      implementation 'androidx.navigation:navigation-ui:2.0.0'

      implementation "androidx.room:room-runtime:2.1.0-beta01"
      annotationProcessor "androidx.room:room-compiler:2.1.0-beta01"
  

【问题讨论】:

How to hide navigation drawer when opening certain fragment?的可能重复 @YQadoome 我分享的代码确实适用于加载SplashFragment,但不适用于下一个片段。我正在使用Architecture Components 中的Navigation 组件将SplashFragment 替换为LoginFragment 【参考方案1】:

您应该将片段中的调用方法更改为

onResume() -> onCreate() onPause() -> onDestroy()

当片段附加到活动时,这两个方法都被调用一次

【讨论】:

我不确定onCreate()onDestroy() 是隐藏和显示的正确位置。但是,在onCreate()onDestroy() 中隐藏和显示不起作用。 你是在片段中做这个吗? 假设,你想为片段显示动作栏或隐藏导航抽屉,那么只需在片段中的 onCreate 或 onDestroy 中定义操作就会对你有所帮助。当第二个片段打开时,您可以为操作栏和导航抽屉定义显示或隐藏的默认设置【参考方案2】:

改变

mCommonMethodsListener.hideActionbar();
mCommonMethodsListener.setDrawerEnabled(False);

((Activity)getActivity()).hideActionbar();
((Activity)getActivity()).setDrawerEnabled(False);

并将它们放入 OnCreate()

【讨论】:

我试过了,但没有任何变化。我分享的代码确实适用于加载 SplashFragment,但不适用于下一个片段。我正在使用 Architecture Components 中的 Navigation 组件将 SplashFragment 替换为 LoginFragment

以上是关于从片段中隐藏 NavigationDrawer 和 ActionBar的主要内容,如果未能解决你的问题,请参考以下文章

NavigationDrawer - 每个片段的不同工具栏

带有片段的 NavigationDrawer 内的 Android TabLayout

android状态栏隐藏navigationdrawer

试图从视图中删除片段在 mNextAnim 上给了我 NullPointerException

CoordinatorLayout + AppBarLayout + NavigationDrawer

在导航抽屉管理的片段之间移动