I'm trying to setText and setDrawable in the NavigationView menuItem after the user is signed in. But after user is signing in i'm getting NullPointerException for the TextView and CircleImageView. Here is the java code and XML for the menu and NavigationView
@Override
protected void onStart() {
super.onStart();
userAuth.addAuthStateListener(authStateListener);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
userAuth = FirebaseAuth.getInstance();
sideMenu = findViewById(R.id.navMenu);
authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if(firebaseAuth.getCurrentUser() != null)
updateActivity(true);
else
updateActivity(false);
}
};
private void updateActivity(Boolean isActive) {
CircleImageView circleImageView = (CircleImageView) sideMenu.getMenu().findItem(R.id.profile_image);
if(isActive)
{
Glide.with(Home.this)
.load(Objects.requireNonNull(userAuth.getCurrentUser()).getPhotoUrl())
.centerCrop()
.into(circleImageView);
((TextView)findViewById(R.id.navName)).setText(userAuth.getCurrentUser().getDisplayName());
sideMenu.getMenu().findItem(R.id.logout).setVisible(true);
sideMenu.getMenu().findItem(R.id.login).setVisible(false);
}else
{
Glide.with(Home.this)
.load(R.drawable.splash_logo)
.centerCrop()
.into(circleImageView);
((TextView)findViewById(R.id.navName)).setText(R.string.app_name);
sideMenu.getMenu().findItem(R.id.logout).setVisible(false);
sideMenu.getMenu().findItem(R.id.login).setVisible(true);
}
}
This is the menu (home.xml)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
android:id="@+id/main"
android:checkableBehavior="single">
<item
android:id="@+id/login"
android:title="Login" />
</group>
<group
android:id="@+id/second"
android:checkableBehavior="single">
<item
android:id="@+id/share"
android:title="Share" />
<item
android:id="@+id/report"
android:title="Report" />
</group>
<group
android:id="@+id/third"
android:checkableBehavior="single">
<item
android:id="@+id/license"
android:title="Licenses"/>
<item
android:id="@+id/developer"
android:title="Developer" />
<item
android:id="@+id/contact"
android:title="Contact us" />
<item
android:id="@+id/logout"
android:title="Logout"
android:visible="false" />
</group>
</menu>
This is NavigationView in activity.xml
<com.google.android.material.navigation.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/navigation_header"
app:menu="@menu/home"
android:id="@+id/navMenu"/>
navigation_header.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:orientation="vertical">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/profile_image"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="25dp"
app:civ_border_color="#ffffff"
app:civ_border_width="2dp"
android:src="@color/colorPrimary"/>
<TextView
android:id="@+id/navName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/profile_image"
android:layout_centerHorizontal="true"
android:layout_marginTop="25dp"
android:layout_marginBottom="10dp"
android:fontFamily="@font/montserrat_bold"
android:text="User Name"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="25sp" />
</RelativeLayout>
First try to get headerView
from NavigationView and then get your CircleImageView
and TextView
like below:
View headerView = sideMenu.getHeaderView(0);
CircleImageView circleImageView = (CircleImageView) headerView.findViewById(R.id.profile_image);
TextView navName = (TextView) headerView.findViewById(R.id.navName);
Complete solution:
private void updateActivity(Boolean isActive) {
View headerView = sideMenu.getHeaderView(0);
CircleImageView circleImageView = headerView.findViewById(R.id.profile_image);
TextView navName = headerView.findViewById(R.id.navName);
if(isActive) {
Glide.with(Home.this)
.load(Objects.requireNonNull(userAuth.getCurrentUser()).getPhotoUrl())
.centerCrop()
.into(circleImageView);
navName.setText(userAuth.getCurrentUser().getDisplayName());
sideMenu.getMenu().findItem(R.id.logout).setVisible(true);
sideMenu.getMenu().findItem(R.id.login).setVisible(false);
} else {
Glide.with(Home.this)
.load(R.drawable.splash_logo)
.centerCrop()
.into(circleImageView);
navName.setText(R.string.app_name);
sideMenu.getMenu().findItem(R.id.logout).setVisible(false);
sideMenu.getMenu().findItem(R.id.login).setVisible(true);
}
}