将图像分配给导航抽屉的 header
Assign an image to a header of a navigation drawer
我正在尝试从数据库 (Firebase) 恢复数据并将此数据分配给用户页面,正好在导航抽屉的 header 中。
我创建了一个 XML header 并在 activity_main 中包含了 header 我创建了导航抽屉
在header中,我有一个images的vision和两个textview。
activity_main代码:
<include
android:id="@+id/main_page_toolbar"
layout="@layout/app_bar_layout" />
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:openDrawer="end">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/AlertDialog.AppCompat.Light" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/colorPrimary"
app:headerLayout="@layout/nav_header"
app:itemIconTint="@color/colorAccent"
app:itemTextColor="@color/colorAccent"
app:menu="@menu/main_menu" />
</android.support.v4.widget.DrawerLayout>
现在 Java,我创建了一个 class,我在其中从数据库恢复用户数据
mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
String current_uid = mCurrentUser.getUid();
mUserData = FirebaseDatabase.getInstance().getReference().child("User").child(current_uid);
mUserData.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
name = dataSnapshot.child("name").getValue().toString();
image = dataSnapshot.child("image").getValue().toString();
status = dataSnapshot.child("status").getValue().toString();
thumb_image = dataSnapshot.child("thumb_image").getValue().toString();
}
所以,在主activity中,我想将图像、用户名和状态分配给导航header。
//NavigationView
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
UserData userData = new UserData();(ImageView)navigationView.findViewById(R.id.imageViewUserImage);
TextView nav_userName = (TextView)navigationView.findViewById(R.id.textViewUsername);
TextView nav_userStatus = (TextView)navigationView.findViewById(R.id.textViewUserStatus);
nav_userName.setText(userData.name);
nav_userStatus.setText(userData.status);
因此,当我 运行 应用程序时,应用程序崩溃了。我不知道我在 header 中获取图像或文本视图的方式是否有问题或其他原因。
这是我的第一个应用程序,我的代码有点乱,所以我没有在这里包含完整的代码。
尝试在设置值之前打印 userData.name 和 userData.status 值。我认为它们都是空的。
您最好使用 DrawerLayout 在 NavigationDrawer 中找到您的视图,如下所示
TextView nav_userName = (TextView)drawer.findViewById(R.id.textViewUsername);
TextView nav_userStatus = (TextView)drawer.findViewById(R.id.textViewUserStatus);
而不是
TextView nav_userName = (TextView)navigationView.findViewById(R.id.textViewUsername);
TextView nav_userStatus = (TextView)navigationView.findViewById(R.id.textViewUserStatus);
找到答案,
View header = navigationView.getHeaderView(0);
ImageView nav_userImage = header.findViewById(R.id.imageViewUserImage);
TextView nav_userName = header.findViewById(R.id.textViewUsername);
TextView nav_userStatus = header.findViewById(R.id.textViewUserStatus);
这解决了问题,需要指向 header 视图索引。
谢谢大家。
我正在尝试从数据库 (Firebase) 恢复数据并将此数据分配给用户页面,正好在导航抽屉的 header 中。
我创建了一个 XML header 并在 activity_main 中包含了 header 我创建了导航抽屉 在header中,我有一个images的vision和两个textview。
activity_main代码:
<include
android:id="@+id/main_page_toolbar"
layout="@layout/app_bar_layout" />
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:openDrawer="end">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/AlertDialog.AppCompat.Light" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/colorPrimary"
app:headerLayout="@layout/nav_header"
app:itemIconTint="@color/colorAccent"
app:itemTextColor="@color/colorAccent"
app:menu="@menu/main_menu" />
</android.support.v4.widget.DrawerLayout>
现在 Java,我创建了一个 class,我在其中从数据库恢复用户数据
mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
String current_uid = mCurrentUser.getUid();
mUserData = FirebaseDatabase.getInstance().getReference().child("User").child(current_uid);
mUserData.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
name = dataSnapshot.child("name").getValue().toString();
image = dataSnapshot.child("image").getValue().toString();
status = dataSnapshot.child("status").getValue().toString();
thumb_image = dataSnapshot.child("thumb_image").getValue().toString();
}
所以,在主activity中,我想将图像、用户名和状态分配给导航header。
//NavigationView
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
UserData userData = new UserData();(ImageView)navigationView.findViewById(R.id.imageViewUserImage);
TextView nav_userName = (TextView)navigationView.findViewById(R.id.textViewUsername);
TextView nav_userStatus = (TextView)navigationView.findViewById(R.id.textViewUserStatus);
nav_userName.setText(userData.name);
nav_userStatus.setText(userData.status);
因此,当我 运行 应用程序时,应用程序崩溃了。我不知道我在 header 中获取图像或文本视图的方式是否有问题或其他原因。
这是我的第一个应用程序,我的代码有点乱,所以我没有在这里包含完整的代码。
尝试在设置值之前打印 userData.name 和 userData.status 值。我认为它们都是空的。
您最好使用 DrawerLayout 在 NavigationDrawer 中找到您的视图,如下所示
TextView nav_userName = (TextView)drawer.findViewById(R.id.textViewUsername);
TextView nav_userStatus = (TextView)drawer.findViewById(R.id.textViewUserStatus);
而不是
TextView nav_userName = (TextView)navigationView.findViewById(R.id.textViewUsername);
TextView nav_userStatus = (TextView)navigationView.findViewById(R.id.textViewUserStatus);
找到答案,
View header = navigationView.getHeaderView(0);
ImageView nav_userImage = header.findViewById(R.id.imageViewUserImage);
TextView nav_userName = header.findViewById(R.id.textViewUsername);
TextView nav_userStatus = header.findViewById(R.id.textViewUserStatus);
这解决了问题,需要指向 header 视图索引。 谢谢大家。