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

Pro*_*tle 5 android android-layout android-view

我有一个DrawerLayout包含NavigationView标题布局的a.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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我找不到ImageViewfindViewById(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
Run Code Online (Sandbox Code Playgroud)

setContentView()在上面的代码之前打过电话.并成功Glide加载图像ImageView.为什么我不能找到它findViewById()

我想这是因为图像视图不在传递给的XML文件中setContentView().但是,我可以通过findViewById()以下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) {

    }
};
Run Code Online (Sandbox Code Playgroud)

var*_*jsi 6

当你在更高版本中使用导航视图,比如编译'com.android.support:design:25.3.1'时,你必须实现你的视图如下:

View parentView = your_navigationView.getHeaderView(0);
TextView text = (TextView)parentView.findViewById(R.id.textView);
Run Code Online (Sandbox Code Playgroud)


Vuc*_*cko 1

我也遇到过类似的问题。代替:

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

也许尝试:

View parentView = findViewById(R.id.ID_OF_PARENT_LINEAR_LAYOUT);
View viewById = parentView.findViewById(R.id.ivDrawerUserFace);
Run Code Online (Sandbox Code Playgroud)

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

ID_OF_PARENT_LINEAR_LAYOUT

用它。