将图像分配给导航抽屉的 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 视图索引。 谢谢大家。