关于NavigationView使用出现的问题(控件绑定时应该先绑菜单视图而不是子项)

开源项目CircleImageView轻松实现图片圆形化的功能

implementation 'de.hdodenhof:circleimageview:3.0.1'

创建menu文件夹,创建nav_menu.xml文件,编写菜单子项

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:title="Call"
            android:id="@+id/navCall"
            android:icon="@drawable/nav_call"/>
        <item
            android:title="Friends"
            android:id="@+id/navFriends"
            android:icon="@drawable/nav_friends"/>
        <item
            android:title="Location"
            android:id="@+id/navLocation"
            android:icon="@drawable/nav_location"/>
        <item
            android:title="Mail"
            android:id="@+id/navMail"
            android:icon="@drawable/nav_mail"/>
        <item
            android:title="Task"
            android:id="@+id/navTask"
            android:icon="@drawable/nav_task"/>
    </group>
</menu>

创建侧拉菜单头部视图nav_header.xml,与main.xml同级

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="180dp"
    android:padding="10dp"
    android:background="@color/design_default_color_primary_variant">

    <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:id="@+id/iconImage"
        android:src="@drawable/nav_icon"
        android:layout_centerInParent="true"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/mailText"
        android:layout_alignParentBottom="true"
        android:text="tonygreendev@gmail.com"
        android:textColor="#FFF"
        android:textSize="14sp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/userText"
        android:layout_above="@+id/mailText"
        android:text="Tony Green"
        android:textColor="#FFF"
        android:textSize="14sp"/>

</RelativeLayout>

main.xml的代码

<?xml version="1.0" encoding="utf-8"?>
<!-- Use DrawerLayout as root container for activity -->
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/design_default_color_primary"
            android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
            app:popupTheme="@style/Theme.AppCompat.Light"/>
    </FrameLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity = "start"
        app:menu="@menu/nav_menu"
        app:headerLayout="@layout/nav_header"/>

</androidx.drawerlayout.widget.DrawerLayout>

menu中toolbar.xml的代码

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
   <item android:id="@+id/backup"
       android:icon="@drawable/ic_backup"
       android:title="Backup"
       app:showAsAction="always"/>
    <item android:id="@+id/delete"
        android:icon="@drawable/ic_delete"
        android:title="Delete"
        app:showAsAction="always"/>
    <item android:id="@+id/settings"
        android:icon="@drawable/ic_settings"
        android:title="Settings"
        app:showAsAction="always"/>

</menu>

MainActivity中的代码

package com.example.materialtest

import android.content.ClipData
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.appcompat.view.menu.MenuView
import androidx.appcompat.widget.Toolbar
import androidx.core.view.GravityCompat
import androidx.core.view.MenuItemCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.navigation.Navigation
import com.google.android.material.internal.NavigationMenu
import com.google.android.material.internal.NavigationMenuItemView
import com.google.android.material.navigation.NavigationView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar : Toolbar = findViewById(R.id.toolbar)
        val navView : NavigationView = findViewById(R.id.navView)
        val drawerLayout : DrawerLayout = findViewById(R.id.drawerLayout)

        setSupportActionBar(toolbar)
        supportActionBar?.let {
            it.setDisplayHomeAsUpEnabled(true)
            it.setHomeAsUpIndicator(R.drawable.ic_menu)
        }
        navView.setCheckedItem(R.id.navCall)
        navView.setNavigationItemSelectedListener {
            drawerLayout.closeDrawers()
            true
        }
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.toolbar,menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val drawerLayout : DrawerLayout = findViewById(R.id.drawerLayout)
        when(item.itemId){
            R.id.backup -> Toast.makeText(this,"you clicked backup",Toast.LENGTH_LONG).show()
            R.id.delete -> Toast.makeText(this,"you clicked delete",Toast.LENGTH_LONG).show()
            R.id.settings -> Toast.makeText(this,"you clicked settings",Toast.LENGTH_LONG).show()
            android.R.id.home -> drawerLayout.openDrawer(GravityCompat.START)
        }
        return true
    }
}

出现问题在于控件绑定,绑定时我一开始直接在
val navView : NavigationView = findViewById(R.id.navView)
中绑定了NavigationView的菜单子项id,项目报空指针异常,所以这里应该绑的是菜单视图的,然后再通过
navView.setCheckedItem(R.id.navCall)
navView.setNavigationItemSelectedListener {
drawerLayout.closeDrawers()
true
}
去让菜单绑定子项。


版权声明:本文为m0_51744744原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。