未找到具有字段 ID 的必需视图,但 ID 存在
Required view with id for field was not found but id exists
我有点问题。
我正在尝试 BindView
使用 ID ongoing_call_layout
。
我有那个 id,它存在并且它是 xml 中的一个 ConstraintLayout
对象。
当 运行 程序表现得像 ID "ongoing_call_layout" 不存在。
我已经尝试清理和重建项目并使用 findViewById
而不是 BindView
,但它仍然说该 ID 不存在。
在代码本身中它是粗体的(AndroidStudio 确实知道 id 在哪里)。
下面是相关代码
这是我的OngoingCallActivity.java
(错误来源):
@BindView(R.id.ongoing_call_layout) ConstraintLayout mOngoingCallLayout;
.
.
.
ButterKnife.bind(this);
.
.
错误:
Unable to start activity ComponentInfo{com.chooloo.www.callmanager/com.chooloo.www.callmanager.ui.activity.OngoingCallActivity}: java.lang.IllegalStateException: Required view 'ongoing_call_layout' with ID 2131362055 for field 'mOngoingCallLayout' was not found. If this view is optional add '@Nullable' (fields) or '@Optional' (methods) annotation.
这是我的 on_going_call.xml
(id 的来源):
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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/ongoing_call_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr"
tools:context=".ui.activity.OngoingCallActivity">
<!-- Call Timer -->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guide_status_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="24dp" />
<TextView
android:id="@+id/text_stopwatch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guide_status_bar"
tools:text="00:00" />
<!-- Caller Number (Temporary) -->
<!-- Caller Pic -->
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="129dp"
android:layout_height="135dp"
app:layout_constraintBottom_toTopOf="@+id/text_caller"
app:layout_constraintEnd_toEndOf="@+id/text_caller"
app:layout_constraintStart_toStartOf="@+id/text_caller"
app:layout_constraintTop_toBottomOf="@+id/text_stopwatch">
<ImageView
android:id="@+id/image_placeholder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tint="@color/selector_button_icon"
app:srcCompat="@drawable/ic_account_circle_black_24dp" />
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/image_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
app:civ_border_width="0dp" />
</FrameLayout>
<!-- Caller Name -->
<TextView
android:id="@+id/text_caller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10sp"
android:paddingRight="10sp"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline4"
android:textColor="?attr/iconColor"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/text_status"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
tools:text="Jesus" />
<!-- Call Status -->
<TextView
android:id="@+id/text_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
android:textColor="?attr/colorAccent"
app:layout_constraintBottom_toTopOf="@+id/guide_eye_level"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="@+id/text_caller"
tools:text="@string/status_call_incoming" />
<!-- Hold Button -->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guide_eye_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.44" />
<ImageView
android:id="@+id/button_hold"
android:layout_width="@dimen/flat_button_size"
android:layout_height="62dp"
android:layout_marginStart="16dp"
android:layout_marginTop="120dp"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/button_add_call"
app:layout_constraintEnd_toStartOf="@+id/button_speaker"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/button_mute"
app:layout_constraintTop_toTopOf="@+id/guide_eye_level"
app:layout_constraintVertical_bias="0.32999998"
app:layout_constraintVertical_chainStyle="packed"
app:srcCompat="@drawable/ic_pause_black_24dp"
tools:visibility="visible" />
<!-- Mute Button -->
<ImageView
android:id="@+id/button_mute"
android:layout_width="@dimen/flat_button_size"
android:layout_height="@dimen/flat_button_size"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/button_hold"
app:layout_constraintEnd_toStartOf="@+id/button_hold"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/button_hold"
app:srcCompat="@drawable/ic_mic_off_black_24dp"
tools:visibility="visible" />
<!-- Speaker Button -->
<ImageView
android:id="@+id/button_speaker"
android:layout_width="@dimen/flat_button_size"
android:layout_height="@dimen/flat_button_size"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/button_hold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/button_hold"
app:layout_constraintTop_toTopOf="@+id/button_hold"
app:srcCompat="@drawable/ic_volume_up_black_24dp"
tools:visibility="visible" />
<!-- Keypad Button -->
<ImageView
android:id="@+id/button_keypad"
android:layout_width="@dimen/flat_button_size"
android:layout_height="@dimen/flat_button_size"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/button_add_call"
app:layout_constraintEnd_toStartOf="@+id/button_add_call"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/button_add_call"
app:srcCompat="@drawable/ic_dialpad_black_24dp"
tools:visibility="visible" />
<!-- Add Call Button -->
<ImageView
android:id="@+id/button_add_call"
android:layout_width="65dp"
android:layout_height="67dp"
android:layout_marginStart="16dp"
android:layout_marginTop="32dp"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/button_keypad"
app:layout_constraintTop_toBottomOf="@+id/button_hold"
app:srcCompat="@drawable/ic_add_black_24dp"
tools:visibility="visible" />
<!-- Answer Button -->
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/answer_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginBottom="32dp"
android:scaleType="center"
android:src="@drawable/ic_call_black_24dp"
android:tint="@color/green_phone"
app:backgroundTint="@color/white"
app:fabCustomSize="72dp"
app:fabSize="normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:maxImageSize="36dp" />
<!-- Reject Button -->
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/reject_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:layout_marginBottom="32dp"
android:scaleType="center"
android:src="@drawable/ic_call_end_black_24dp"
android:tint="@color/red_phone"
app:backgroundTint="@color/white"
app:fabCustomSize="72dp"
app:fabSize="normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:maxImageSize="36dp" />
<!-- Guidelines -->
</androidx.constraintlayout.widget.ConstraintLayout>
我无法声明 mOngoingCallLayout Nullable
,因为这是必要的。
顺便说一句,在我从服务器合并了一些代码之后,那个错误才开始无处不在,但与此相关的所有代码仍然是一样的。
感谢您的帮助
我不确定它如何用于 butterknife,但是,要在您的应用程序中启用数据绑定,您需要在 AndroidManifest.xml
的 android
部分中声明以下内容。
android {
dataBinding {
enabled = true
}
}
然后你需要用 layout
包裹你的 on_going_call.xml.xml
如下。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
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">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ongoing_call_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr">
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
是的,如评论中所述,您需要在 activity 中 setContentView
。
希望对您有所帮助!
您可以尝试几种方法
- 重建项目
- 清理项目
- 使缓存无效/重新启动
您也可以尝试 ButterKnife 插件 = 设置 -> 插件 -> Android ButterKnife Zelezny;
要访问插件菜单,请将键盘光标放在 setContentView(R.layout.your_activity)
中的 activity 名称上,然后按 ALT + INSERT
这将是最后一个或倒数第二个选项 Generate ButterKnife Injections
希望这会有所帮助
我有点问题。
我正在尝试 BindView
使用 ID ongoing_call_layout
。
我有那个 id,它存在并且它是 xml 中的一个 ConstraintLayout
对象。
当 运行 程序表现得像 ID "ongoing_call_layout" 不存在。
我已经尝试清理和重建项目并使用 findViewById
而不是 BindView
,但它仍然说该 ID 不存在。
在代码本身中它是粗体的(AndroidStudio 确实知道 id 在哪里)。
下面是相关代码
这是我的OngoingCallActivity.java
(错误来源):
@BindView(R.id.ongoing_call_layout) ConstraintLayout mOngoingCallLayout;
.
.
.
ButterKnife.bind(this);
.
.
错误:
Unable to start activity ComponentInfo{com.chooloo.www.callmanager/com.chooloo.www.callmanager.ui.activity.OngoingCallActivity}: java.lang.IllegalStateException: Required view 'ongoing_call_layout' with ID 2131362055 for field 'mOngoingCallLayout' was not found. If this view is optional add '@Nullable' (fields) or '@Optional' (methods) annotation.
这是我的 on_going_call.xml
(id 的来源):
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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/ongoing_call_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr"
tools:context=".ui.activity.OngoingCallActivity">
<!-- Call Timer -->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guide_status_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="24dp" />
<TextView
android:id="@+id/text_stopwatch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guide_status_bar"
tools:text="00:00" />
<!-- Caller Number (Temporary) -->
<!-- Caller Pic -->
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="129dp"
android:layout_height="135dp"
app:layout_constraintBottom_toTopOf="@+id/text_caller"
app:layout_constraintEnd_toEndOf="@+id/text_caller"
app:layout_constraintStart_toStartOf="@+id/text_caller"
app:layout_constraintTop_toBottomOf="@+id/text_stopwatch">
<ImageView
android:id="@+id/image_placeholder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tint="@color/selector_button_icon"
app:srcCompat="@drawable/ic_account_circle_black_24dp" />
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/image_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
app:civ_border_width="0dp" />
</FrameLayout>
<!-- Caller Name -->
<TextView
android:id="@+id/text_caller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10sp"
android:paddingRight="10sp"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline4"
android:textColor="?attr/iconColor"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/text_status"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
tools:text="Jesus" />
<!-- Call Status -->
<TextView
android:id="@+id/text_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
android:textColor="?attr/colorAccent"
app:layout_constraintBottom_toTopOf="@+id/guide_eye_level"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="@+id/text_caller"
tools:text="@string/status_call_incoming" />
<!-- Hold Button -->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guide_eye_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.44" />
<ImageView
android:id="@+id/button_hold"
android:layout_width="@dimen/flat_button_size"
android:layout_height="62dp"
android:layout_marginStart="16dp"
android:layout_marginTop="120dp"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/button_add_call"
app:layout_constraintEnd_toStartOf="@+id/button_speaker"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/button_mute"
app:layout_constraintTop_toTopOf="@+id/guide_eye_level"
app:layout_constraintVertical_bias="0.32999998"
app:layout_constraintVertical_chainStyle="packed"
app:srcCompat="@drawable/ic_pause_black_24dp"
tools:visibility="visible" />
<!-- Mute Button -->
<ImageView
android:id="@+id/button_mute"
android:layout_width="@dimen/flat_button_size"
android:layout_height="@dimen/flat_button_size"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/button_hold"
app:layout_constraintEnd_toStartOf="@+id/button_hold"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/button_hold"
app:srcCompat="@drawable/ic_mic_off_black_24dp"
tools:visibility="visible" />
<!-- Speaker Button -->
<ImageView
android:id="@+id/button_speaker"
android:layout_width="@dimen/flat_button_size"
android:layout_height="@dimen/flat_button_size"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/button_hold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/button_hold"
app:layout_constraintTop_toTopOf="@+id/button_hold"
app:srcCompat="@drawable/ic_volume_up_black_24dp"
tools:visibility="visible" />
<!-- Keypad Button -->
<ImageView
android:id="@+id/button_keypad"
android:layout_width="@dimen/flat_button_size"
android:layout_height="@dimen/flat_button_size"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/button_add_call"
app:layout_constraintEnd_toStartOf="@+id/button_add_call"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/button_add_call"
app:srcCompat="@drawable/ic_dialpad_black_24dp"
tools:visibility="visible" />
<!-- Add Call Button -->
<ImageView
android:id="@+id/button_add_call"
android:layout_width="65dp"
android:layout_height="67dp"
android:layout_marginStart="16dp"
android:layout_marginTop="32dp"
android:background="@drawable/ripple_oval"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/flat_button_padding"
android:tint="@color/selector_button_icon"
android:visibility="invisible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/button_keypad"
app:layout_constraintTop_toBottomOf="@+id/button_hold"
app:srcCompat="@drawable/ic_add_black_24dp"
tools:visibility="visible" />
<!-- Answer Button -->
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/answer_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginBottom="32dp"
android:scaleType="center"
android:src="@drawable/ic_call_black_24dp"
android:tint="@color/green_phone"
app:backgroundTint="@color/white"
app:fabCustomSize="72dp"
app:fabSize="normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:maxImageSize="36dp" />
<!-- Reject Button -->
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/reject_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:layout_marginBottom="32dp"
android:scaleType="center"
android:src="@drawable/ic_call_end_black_24dp"
android:tint="@color/red_phone"
app:backgroundTint="@color/white"
app:fabCustomSize="72dp"
app:fabSize="normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:maxImageSize="36dp" />
<!-- Guidelines -->
</androidx.constraintlayout.widget.ConstraintLayout>
我无法声明 mOngoingCallLayout Nullable
,因为这是必要的。
顺便说一句,在我从服务器合并了一些代码之后,那个错误才开始无处不在,但与此相关的所有代码仍然是一样的。
感谢您的帮助
我不确定它如何用于 butterknife,但是,要在您的应用程序中启用数据绑定,您需要在 AndroidManifest.xml
的 android
部分中声明以下内容。
android {
dataBinding {
enabled = true
}
}
然后你需要用 layout
包裹你的 on_going_call.xml.xml
如下。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
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">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ongoing_call_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr">
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
是的,如评论中所述,您需要在 activity 中 setContentView
。
希望对您有所帮助!
您可以尝试几种方法
- 重建项目
- 清理项目
- 使缓存无效/重新启动
您也可以尝试 ButterKnife 插件 = 设置 -> 插件 -> Android ButterKnife Zelezny;
要访问插件菜单,请将键盘光标放在 setContentView(R.layout.your_activity)
中的 activity 名称上,然后按 ALT + INSERT
这将是最后一个或倒数第二个选项 Generate ButterKnife Injections
希望这会有所帮助