今天照着郭霖的《第一行代码Android-第二版》中的NavigationView章节进行敲代码。实现的效果如下:
书中并没有实现对NavigationView中的header里的TextView的值进行修改,所以我自己试着实现这一功能。但当我进行对TextView的值进行修改的时候,程序竟然莫名其妙的出现闪退。
程序的实现代码如下:
1.点击menu文件夹->New->Menu resource file,创建一个nav_menu.xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_call"
android:title="Call" />
<item
android:id="@+id/nav_friends"
android:title="Friends" />
<item
android:id="@+id/nav_location"
android:title="Location" />
<item
android:id="@+id/nav_mail"
android:title="Mail" />
<item
android:id="@+id/nav_task"
android:title="Tasks" />
</group>
</menu>
2.点击layout文件夹>-New>Layout resource file,创建一个nav_header.xml文件。
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="180dp"
android:padding="10dp"
android:background="?attr/colorPrimary">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/icon_image"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher_background" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/mail"
android:layout_alignParentBottom="true"
android:text="[email protected]"
android:textColor="#FFF"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/username"
android:layout_above="@id/mail"
android:text="Jerry"
android:textColor="#FFF"
android:textSize="14sp" />
</RelativeLayout>
这里使用到了CircleImageView用来实现图片圆形化,别忘了导入相应的依赖:
implementation 'de.hdodenhof:circleimageview:3.1.0'
3.修改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:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/drawer_layout"
tools:context=".MainActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:id="@+id/toolbar"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
</FrameLayout>
<com.google.android.material.navigation.NavigationView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/nav_view"
android:layout_gravity="start"
app:menu="@menu/nav_menu"
app:headerLayout="@layout/nav_header" />
</androidx.drawerlayout.widget.DrawerLayout>
4.最后修改MainActivity中的代码
package com.example.navagationviewtest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
}
执行程序
现在我准备修改header中的mail以及username中的值,修改MainActivity
public class MainActivity extends AppCompatActivity {
private TextView mail;
private TextView userName ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mail = findViewById(R.id.mail);
userName = findViewById(R.id.username);
mail.setText("[email protected]");
userName.setText("Dr.wei");
}
}
程序直接闪退了,如下图
对程序进行断点调试时发现Android并没有找到引用TextView的地方,对其进行修改值时会造成空指针异常。
解决办法:
当我们需要修改NavigationView中的header中的值的时候,不要直接进行修改,而是应该得到header的View进行修改值,代码如下:
public class MainActivity extends AppCompatActivity {
private TextView mail;
private TextView userName ;
private NavigationView navView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
navView = findViewById(R.id.nav_view);
// mail = findViewById(R.id.mail);
// userName = findViewById(R.id.username);
// mail.setText("[email protected]");
// userName.setText("Dr.wei");
if (navView.getHeaderCount() > 0){
//获取NavigationView中header布局中的view
View header = navView.getHeaderView(0);
//获取header中的控件,而不是直接findViewById
mail = header.findViewById(R.id.mail);
userName = header.findViewById(R.id.username);
mail.setText("[email protected]");
userName.setText("Dr.wei");
}
}
}
运行结果:
可以看出TextView中的值已经成功被修改。
扫描二维码关注公众号,回复:
12467258 查看本文章
