从片段中隐藏 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。
我有两个片段,分别称为 SplashFragment
和 LoginFragment
。我在两个片段中都调用了hideActionBar()
和'showActionBar()in
onResume()and
onPause()`。
SplashFragment
加载时没有 ActionBar
和 NavigationDrawer
。带有postDelayed
的Handler
将在预设延迟3000 毫秒后导航到LoginFragment
。
LoginFragment
出现 ActionBar
和 NavigationDrawer
。
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 内的 Android TabLayout
试图从视图中删除片段在 mNextAnim 上给了我 NullPointerException