如何在特定片段上应用抽屉布局?
我有以下问题:
我想使用导航组件,因此我只有一个活动(MainActivity)和几个片段。
我有两种类型的片段:验证内容和实际应用程序。 实际应用包含抽屉布局,并且身份验证内容只能位于约束布局中。
但问题是身份验证片段还显示抽屉布局的状态栏。
我尝试隐藏这些片段上的操作栏,调用 ((AppCompatActivity)getActivity()).getSupportActionBar().hide();
但这不起作用,我在屏幕顶部看到了一个黑色空间。
有没有什么方法可以将抽屉布局应用到特定的片段或通用更好的方法来获得这种行为?
MainActivity.java
public class MainActivity extends AppCompatActivity
{
private NavController navController;
private DrawerLayout drawerLayout;
private AppBarConfiguration appBarConfiguration;
private NavController.OnDestinationChangedListener listener;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
navController = Navigation.findNavController(this, R.id.fragment);
drawerLayout = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.navigationView);
NavigationUI.setupWithNavController(navigationView, navController);
appBarConfiguration = new AppBarConfiguration.Builder(R.id.firstFragment, R.id.secondFragment)
.setOpenableLayout(drawerLayout)
.build();
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
navController.addOnDestinationChangedListener((_c, destination, _b) ->
{
if (destination.getId() == R.id.mainFragment ||
destination.getId() == R.id.loginFragment ||
destination.getId() == R.id.registerUserFragment)
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
else
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity">
<fragment
android:id="@+id/fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="1dp"
android:layout_marginTop="1dp"
android:layout_marginEnd="1dp"
android:layout_marginBottom="1dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/my_nav" />
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/drawer_menu" />
</androidx.drawerlayout.widget.DrawerLayout>
my_nav.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/my_nav"
app:startDestination="@id/mainFragment">
<fragment
android:id="@+id/firstFragment"
android:name="com.mioai.gamehub.FirstFragment"
android:label="fragment_first"
tools:layout="@layout/fragment_first">
<action
android:id="@+id/navigateToSecondFragment"
app:destination="@id/secondFragment"
app:enterAnim="@android:anim/fade_in"
app:exitAnim="@android:anim/fade_out" />
</fragment>
<fragment
android:id="@+id/secondFragment"
android:name="com.mioai.gamehub.SecondFragment"
android:label="fragment_second"
tools:layout="@layout/fragment_second" />
<fragment
android:id="@+id/mainFragment"
android:name="com.mioai.gamehub.MainFragment"
tools:layout="@layout/fragment_main">
<action
android:id="@+id/action_mainFragment_to_firstFragment"
app:destination="@id/firstFragment" />
<action
android:id="@+id/action_mainFragment_to_loginFragment"
app:destination="@id/loginFragment" />
</fragment>
<fragment
android:id="@+id/loginFragment"
android:name="com.mioai.gamehub.LoginFragment"
android:label="fragment_login"
tools:layout="@layout/fragment_login" >
<action
android:id="@+id/action_loginFragment_to_registerUserFragment2"
app:destination="@id/registerUserFragment" />
</fragment>
<fragment
android:id="@+id/registerUserFragment"
android:name="com.mioai.gamehub.RegisterUserFragment"
android:label="fragment_register_user"
tools:layout="@layout/fragment_register_user" />
</navigation>
I have the following problem:
I want to use navigation components and therefore I have only one activity (MainActivity) and several fragments.
I have two types of fragments: authenticating stuff and the actual app.
The actual app contains a drawer layout and the auth stuff should only be in contraint layouts.
But the problem is that the auth fragments also are showing the statusbar of the drawer layout.
I tried to hide the actionbar on these fragments calling ((AppCompatActivity)getActivity()).getSupportActionBar().hide();
But this did not work and I got a black space at the top of the screen.
Is there any way to apply the drawerlayout to specific fragments or a general better approach to get this behavior?
MainActivity.java
public class MainActivity extends AppCompatActivity
{
private NavController navController;
private DrawerLayout drawerLayout;
private AppBarConfiguration appBarConfiguration;
private NavController.OnDestinationChangedListener listener;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
navController = Navigation.findNavController(this, R.id.fragment);
drawerLayout = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.navigationView);
NavigationUI.setupWithNavController(navigationView, navController);
appBarConfiguration = new AppBarConfiguration.Builder(R.id.firstFragment, R.id.secondFragment)
.setOpenableLayout(drawerLayout)
.build();
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
navController.addOnDestinationChangedListener((_c, destination, _b) ->
{
if (destination.getId() == R.id.mainFragment ||
destination.getId() == R.id.loginFragment ||
destination.getId() == R.id.registerUserFragment)
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
else
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity">
<fragment
android:id="@+id/fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="1dp"
android:layout_marginTop="1dp"
android:layout_marginEnd="1dp"
android:layout_marginBottom="1dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/my_nav" />
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/drawer_menu" />
</androidx.drawerlayout.widget.DrawerLayout>
my_nav.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/my_nav"
app:startDestination="@id/mainFragment">
<fragment
android:id="@+id/firstFragment"
android:name="com.mioai.gamehub.FirstFragment"
android:label="fragment_first"
tools:layout="@layout/fragment_first">
<action
android:id="@+id/navigateToSecondFragment"
app:destination="@id/secondFragment"
app:enterAnim="@android:anim/fade_in"
app:exitAnim="@android:anim/fade_out" />
</fragment>
<fragment
android:id="@+id/secondFragment"
android:name="com.mioai.gamehub.SecondFragment"
android:label="fragment_second"
tools:layout="@layout/fragment_second" />
<fragment
android:id="@+id/mainFragment"
android:name="com.mioai.gamehub.MainFragment"
tools:layout="@layout/fragment_main">
<action
android:id="@+id/action_mainFragment_to_firstFragment"
app:destination="@id/firstFragment" />
<action
android:id="@+id/action_mainFragment_to_loginFragment"
app:destination="@id/loginFragment" />
</fragment>
<fragment
android:id="@+id/loginFragment"
android:name="com.mioai.gamehub.LoginFragment"
android:label="fragment_login"
tools:layout="@layout/fragment_login" >
<action
android:id="@+id/action_loginFragment_to_registerUserFragment2"
app:destination="@id/registerUserFragment" />
</fragment>
<fragment
android:id="@+id/registerUserFragment"
android:name="com.mioai.gamehub.RegisterUserFragment"
android:label="fragment_register_user"
tools:layout="@layout/fragment_register_user" />
</navigation>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论