导航抽屉强制关闭 activity,如何解决?

Navigation drawer force close from activity, how to fix it?

我有一个导航抽屉放在主 activity 上,但是当我打开 activity 主时,应用程序立即强制关闭。

我将抽屉布局属性与activity_main.xml[编辑]

结合起来
    <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/drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".UtamaActivity"
        android:layoutDirection="locale">
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        
   ...

            <ImageButton
                android:id="@+id/btn_nav"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_menu"
                android:background="@android:color/transparent"
                android:layout_margin="15dp" />
    
            <com.google.android.material.navigation.NavigationView
                android:id="@+id/nav_view"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentStart="true"
                app:headerLayout="@layout/header_nav"
                app:menu="@menu/nav_menu" />
    
...

        </RelativeLayout>
    </androidx.drawerlayout.widget.DrawerLayout>

我使用上面的图像按钮以编程方式打开抽屉布局。

drawerLayout = findViewById(R.id.drawer_layout);
    findViewById(R.id.btn_nav).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            drawerLayout.openDrawer(GravityCompat.START);
            drawerLayout.closeDrawer(GravityCompat.START);
        }
    });

这是一个管理抽屉布局使用的程序,我用图片按钮打开了抽屉布局,但是我发现的问题是,我没有进入主activity,我的应用程序强制关闭,我该如何解决这个问题?

问题的根源在于 NavigationView 标签上缺少 android:layout_gravity 属性,因此请尝试以下操作

<com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_gravity = "start"
        ...
        ... /> 
<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:layoutDirection="locale">

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/rootView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

   <ImageButton
    android:id="@+id/btn_nav"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_menu"
    android:background="@android:color/transparent"
    android:layout_margin="15dp" />


</androidx.constraintlayout.widget.ConstraintLayout>

<com.google.android.material.navigation.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@color/white"
    app:itemIconTint="@color/white"
    app:itemTextColor="@color/text_dark"
    app:menu="@menu/activity_main2_drawer">

</com.google.android.material.navigation.NavigationView>

//使用此代码获取抽屉是否打开

drawerLayout = findViewById(R.id.drawer_layout);
findViewById(R.id.btn_nav).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (drawerLayout .isDrawerOpen(GravityCompat.START)) {
        drawerLayout.closeDrawer(GravityCompat.START)
    } else {
        drawerLayout.openDrawer(GravityCompat.START)
    }
    }
});

您正在同时打开和关闭抽屉,在您的代码中:

public void onClick(View view) {
            drawerLayout.openDrawer(GravityCompat.START);
            drawerLayout.closeDrawer(GravityCompat.START);
        } 

您先调用drawerLayout.openDrawer(GravityCompat.START);,然后立即调用drawerLayout.closeDrawer(GravityCompat.START);,当程序运行时,这将打开抽屉并立即关闭抽屉。

您只需从上面的代码中删除 drawerLayout.closeDrawer(GravityCompat.START);