如何访问 kotlin 导航抽屉中导航视图内的视图

问题描述 投票:0回答:1

我想要导航视图中的返回功能。我想知道如何添加单击侦听器以返回位于导航视图内的按钮。我有这样的代码 下面。

我的主要活动

<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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/design_default_color_primary_dark"
    android:fitsSystemWindows="true"
    tools:openDrawer="start"
    android:id="@+id/drawer"
    tools:context=".MainActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:src="@drawable/baseline_supervised_user_circle_24"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            android:paddingTop="10dp"
            android:paddingLeft="10dp"
            android:id="@+id/drawer_icon"
            />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <include android:id="@+id/include_drawr"
        layout="@layout/nav_drawer"
        tools:ignore="InvalidId" />

</androidx.drawerlayout.widget.DrawerLayout>

我的 nav_drawer.xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.navigation.NavigationView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_drawer"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header"
    tools:menu="@menu/nav_menu">

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

我的 nav_header.xml

<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/go_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:layout_editor_absoluteX="131dp"
        tools:layout_editor_absoluteY="60dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/user"
        android:paddingTop="20dp"
        android:paddingLeft="20dp"
        android:src="@drawable/baseline_keyboard_backspace_24" />
    <ImageView
        android:id="@+id/user"
        android:paddingTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:layout_editor_absoluteX="131dp"
        tools:layout_editor_absoluteY="60dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/go_back"
        android:src="@drawable/profile" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="The User Name"
        app:layout_constraintTop_toBottomOf="@+id/user"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textAlignment="center"
        android:textSize="18sp"
        android:layout_marginTop="10dp"
        />
</androidx.constraintlayout.widget.ConstraintLayout>

我的MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val drawerIcon = findViewById<DrawerLayout>(R.id.drawer)
        val drawerImgIcon = findViewById<ImageView>(R.id.drawer_icon)

        drawerImgIcon.setOnClickListener {
            drawerIcon.openDrawer(GravityCompat.START)
        }
        val navigationView: NavigationView =  findViewById(R.id.nav_drawer)
        val header: View = navigationView.getHeaderView(0)
        val goBack: ImageView = header.findViewById(R.id.go_back)

        goBack.setOnClickListener {
            Toast.makeText(this, "Go back button fired.", Toast.LENGTH_SHORT).show()
        }
    }

}

我尝试了上面的代码。它抛出错误。我不知道我的代码中犯了什么错误。

我得到的错误如下

进程:com.example.navigationdrawer,PID:7041 java.lang.RuntimeException:无法启动活动 组件信息{com.example.navigationdrawer/com.example.navigationdrawer.MainActivity}: java.lang.NullPointerException:尝试调用虚拟方法 'android.view.View com.google.android.material.navigation.NavigationView.getHeaderView(int)' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 引起原因:java.lang.NullPointerException:尝试调用虚拟 方法'android.view.View com.google.android.material.navigation.NavigationView.getHeaderView(int)' 在空对象引用上 在 com.example.navigationdrawer.MainActivity.onCreate(MainActivity.kt:33) 在 android.app.Activity.performCreate(Activity.java:7994) 在 android.app.Activity.performCreate(Activity.java:7978) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

kotlin android-studio navigation-drawer navigationview
1个回答
0
投票

大家好,我纠正了我的错误。我所做的是删除了包含标签并且 将 include 标签中的导航标签替换到主 Activity 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/design_default_color_primary_dark"
    android:fitsSystemWindows="true"
    tools:openDrawer="start"
    android:id="@+id/drawer"
    tools:context=".MainActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:src="@drawable/baseline_supervised_user_circle_24"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            android:paddingTop="10dp"
            android:paddingLeft="10dp"
            android:id="@+id/drawer_icon"
            />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <com.google.android.material.navigation.NavigationView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/nav_drawer"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header"
        tools:menu="@menu/nav_menu">

    </com.google.android.material.navigation.NavigationView>
© www.soinside.com 2019 - 2024. All rights reserved.