为什么findViewById()为抽屉头中的视图返回null?

时间:2016-03-08 15:29:57

标签: android android-layout android-view

我有DrawerLayoutNavigationView包装标题布局。 XML如下:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                        xmlns:app="http://schemas.android.com/apk/res-auto"
                                        android:id="@+id/drawer_layout"
                                        android:layout_width="match_parent"
                                        android:layout_height="match_parent">

    <android.support.design.widget.NavigationView
            android:id="@+id/navigation_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/drawer_header"
            app:menu="@menu/drawer"/>

</android.support.v4.widget.DrawerLayout>

headerLayout是一个LinearLayout,其中包含ImageView,下面是drawer_header.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="@color/blue_primary"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="120dp"
        android:id="@+id/ivDrawerUserFace"
        android:layout_height="120dp" />
</LinearLayout>

我不知道为什么我无法通过ImageView找到findViewById(R.id.ivDrawerUserFace),而null会返回ViewGroup headerView = (ViewGroup) mNavigationView.getHeaderView(0); ImageView faceView = (ImageView) headerView.getChildAt(0); // faceView is not null String faceUrl = QingUApp.getInstance().getFaceUrl(); if (faceUrl != null) { Glide.with(this).load(faceUrl).into(faceView); } View viewById = findViewById(R.id.ivDrawerUserFace); // viewById is null 。但是,我可以通过以下代码找到它:

setContentView()

我在上面的代码之前调用了GlideImageView成功将图片加载到findViewById()。为什么我无法通过setContentView()找到它?

我猜是因为图片视图不在传递给findViewById()的XML文件中。但是,我可以Activity在同一个private LoaderManager.LoaderCallbacks<Bitmap> mUserFaceLoaderCallbacks = new LoaderManager.LoaderCallbacks<Bitmap>() { @Override public Loader<Bitmap> onCreateLoader(int i, Bundle bundle) { return new UserFaceLoader(NewQingUActivity.this, mFaceUrl); } @Override public void onLoadFinished(Loader<Bitmap> loader, Bitmap bitmap) { if (bitmap != null) { ImageView ivUserFace = (ImageView) findViewById(R.id.ivDrawerUserFace); ivUserFace.setImageBitmap(bitmap); } } @Override public void onLoaderReset(Loader<Bitmap> loader) { } }; 中使用以下代码获取视图:

conda install python=2.7

2 个答案:

答案 0 :(得分:6)

当您在更高版本中使用导航视图时,例如编译com.android.support:design:25.3.1&#39; ,您必须按如下方式实现您的视图:

View parentView = your_navigationView.getHeaderView(0);
TextView text = (TextView)parentView.findViewById(R.id.textView);

答案 1 :(得分:1)

我遇到了类似的问题。而不是:

View viewById = findViewById(R.id.ivDrawerUserFace);

也许试试:

View parentView = findViewById(R.id.ID_OF_PARENT_LINEAR_LAYOUT);
View viewById = parentView.findViewById(R.id.ivDrawerUserFace);

只需添加包含此视图的线性布局的ID并替换

  

ID_OF_PARENT_LINEAR_LAYOUT

用它。