RuntimeException: не удалось раздуть подкласс поведения
Я новичок в Android и у меня проблемы с FloatingActionButton
behaivors
Мой пользовательский класс поведения:
public class ScrollingFABBehavior extends FloatingActionButton.Behavior {
private static final String TAG = "ScrollingFABBehavior";
public ScrollingFABBehavior(Context context, AttributeSet attrs,
Handler mHandler) {
super();
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout,
FloatingActionButton child, View directTargetChild, View target,
int nestedScrollAxes) {
return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL
|| super.onStartNestedScroll(coordinatorLayout, child,
directTargetChild, target, nestedScrollAxes);
}
@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout,
FloatingActionButton child, View target, int dxConsumed,
int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed,
dyConsumed, dxUnconsumed, dyUnconsumed);
if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {
child.hide();
} else if (dyConsumed < 0 && child.getVisibility() == View.GONE) {
child.show();
}
}
@Override
public void onStopNestedScroll(CoordinatorLayout coordinatorLayout,
FloatingActionButton
child, View target) {
super.onStopNestedScroll(coordinatorLayout, child, target);
}
}
Фрагмент XML:
...
<android.support.design.widget.FloatingActionButton
android:id="@+id/share_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:contentDescription="@string/action_share"
android:elevation="@dimen/fab_elevation"
android:src="@drawable/ic_share"
app:layout_behavior=".ScrollingFABBehavior"/>
</android.support.design.widget.CoordinatorLayout>
RuntimeError, когда фрагмент раздувает xml:
07-14 08:52:43.904 30785-30785/com.example.xyzreader E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.xyzreader, PID: 30785
android.view.InflateException: Binary XML file line #115: Could not inflate Behavior subclass com.example.xyzreader.ui.ScrollingFABBehavior
Caused by: java.lang.RuntimeException: Could not inflate Behavior subclass com.example.xyzreader.ui.ScrollingFABBehavior
at android.support.design.widget.CoordinatorLayout.parseBehavior(CoordinatorLayout.java:615)
at android.support.design.widget.CoordinatorLayout$LayoutParams.<init>(CoordinatorLayout.java:2652)
так далее
В чем дело?
11 ответов
Добавьте следующие два конструктора к вашему FooterBehavior
:
public FooterBehavior() {
}
public FooterBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
Убедитесь, что вы используете правильный путь к классу пользовательского поведения.
Например:
app:layout_behavior="net.company.myapp.view.behavior.TextViewBehavior"
Если вы используете AndroidX (проект с открытым исходным кодом, который команда Android использует для разработки, тестирования, упаковки, версии и выпуска библиотек в Jetpack), вам необходимо обновить XML.
Найдите свой элемент здесь ( https://developer.android.com/jetpack/androidx/migrate) и ответы:
Служба поддержки:
android.support.design.widget.FloatingActionButton
AndroidX:
com.google.android.material.floatingactionbutton.FloatingActionButton
Если вы используете BottomSheet в AndroidX
app: layout_behavior = "@ string / bottom_sheet_behavior">
иначе используйте
app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
Если ваше приложение имеет идентификатор пакета, отличный от фактической структуры пакета, убедитесь, что вы указали полный путь к своему настраиваемому классу поведения:
<android.support.design.widget.FloatingActionButton
...
app:layout_behavior="com.example.xyzreader.ScrollingFABBehavior"/>
У меня была аналогичная проблема, и я оказался на этой странице.
Я работаю с Bottom Sheet на Android X
Я запустил свое приложение и получил следующее сообщение об ошибке, когда я нажал, чтобы перейти к новому фрагменту в приложении, и в приложении произошел сбой с RuntimeExeception: "Не удалось раздувать подкласс Behavior com.google.android.material.bottomsheet.BottomSheetBehaviour"
Мои атрибуты макета были следующими:
<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:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/player_bg"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehaviour"
app:behavior_hideable="true"
app:behavior_peekHeight="70dp">
Когда я получил это сообщение об ошибке, я изменил одну строку, и приложение заработало.
Как описано выше, поскольку я использую Android X, я перешел с:
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehaviour"
Я изменил эту строку на:
app:layout_behavior="@string/bottom_sheet_behavior"
Это одно изменение означало, что код у меня работал, сбоев не было и новый фрагмент появился, как и ожидалось.
Решаемые. + Изменить app:layout_behavior=".ScrollingFABBehavior"/>
в app:layout_behavior=".ui.ScrollingFABBehavior"/>
Если вы работаете с androidX, ваш корневой макет должен быть:
<androidx.coordinatorlayout.widget.CoordinatorLayout
и макет bottom_sheet должен включать:
app:layout_behavior="@string/bottom_sheet_behavior"
иначе, если вы не используете androidx или библиотеку поддержки, ваш корневой макет должен быть:
<android.support.design.widget.CoordinatorLayout
и макет bottom_sheet должен включать:
app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
в kotlin не забудьте переопределить все конструкторы:
class CustomBehaviorBehavior @JvmOverloads constructor(
context: Context? = null,
attrs: AttributeSet? = null
) : CoordinatorLayout.Behavior<YourView>() {
//...
}
Превратить тему приложения в материальные компоненты "parent="Theme.MaterialComponents.Light.NoActionBar" в файле theme.xml
Если вы используете зависимости Androidx Jetpack, тогда
заменять
app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
с участием
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"