findViewById()返回null-我该怎么办?

时间:2018-09-16 07:43:18

标签: android findviewbyid bottom-sheet

我在我的android项目中使用了bottomSheetBehavior。参见下面的代码:

onlineGame.java:

 // get the bottom sheet view
        ConstraintLayout llBottomSheet = findViewById(R.id.end_of_online_game_bottom_sheet_behavior_cl);

// init the bottom sheet behavior
        end_of_online_game_popup = BottomSheetBehavior.from(llBottomSheet);

avtivity_online_game.xml:

.
.
.

    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.androidsample.BottomSheetActivity">

        <!-- include bottom sheet -->
        <include
            android:id="@+id/includeBottomSheetBehavior"
            layout="@layout/test_end_of_online_game_popup" />

    </android.support.design.widget.CoordinatorLayout>
.
.
.

test_end_of_online_game_popup.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/end_of_online_game_bottom_sheet_behavior_cl"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/cardview_light_background"
    android:visibility="gone"
    app:behavior_hideable="false"
    app:behavior_peekHeight="120dp"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
    .
    .
    .

问题是这一行:

ConstraintLayout llBottomSheet = findViewById(R.id.end_of_online_game_bottom_sheet_behavior_cl);

返回null。我什至将代码位置更改为onResume,但是它不起作用。当我在test_end_of_online_game_popup中得到另一个元素时,它工作良好并且不是null。

出什么问题了?

tnx

3 个答案:

答案 0 :(得分:1)

使用包含布局时:

在您为包含标签指定的ID上使用查找视图

findViewById(R.id.includeBottomSheetBehavior)

或者您可以在布局标签中省略ID,以免覆盖该ID。

标记中,仅需要layout属性。此属性是对要包含的布局文件的引用。该标记还允许您覆盖所包含布局的一些属性。

以上示例显示您可以使用android:id来指定所包含布局的根视图的ID; 如果定义了布局,它还将覆盖所包含布局的ID 。同样,您可以覆盖所有布局参数。

来源:http://www.curious-creature.com/2009/02/25/android-layout-trick-2-include-to-reuse/

答案 1 :(得分:1)

两个选择:

  1. ConstraintLayout llBottomSheet = findViewById(R.id. includeBottomSheetBehavior);

  2. <include layout="@layout/test_end_of_online_game_popup" />

答案 2 :(得分:1)

尝试一下:

View view = findViewById(R.id.includeBottomSheetBehavior);//firstly get the root view ID
ConstraintLayout llBottomSheet = view.findViewById(R.id.end_of_online_game_bottom_sheet_behavior_cl);