我想要导航视图中的返回功能。我想知道如何添加单击侦听器以返回位于导航视图内的按钮。我有这样的代码 下面。
我的主要活动
<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)
大家好,我纠正了我的错误。我所做的是删除了包含标签并且 将 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>