运行时异常:无法填充行为子类

34

我是Android的新手,我在使用FloatingActionButton时遇到了一些问题。

以下是我的自定义行为类:

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>

解压XML片段时出现RuntimeError:

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)

等等,这里有什么问题吗?


错误的构造函数... - Selvin
更改为:public ScrollingFABBehavior() { super(); }。没有任何更改。 - Aleksey Leonov
11个回答

44

请在您的 FooterBehavior 中添加以下两个构造函数:

public FooterBehavior() {
}

public FooterBehavior(Context context, AttributeSet attrs) {
    super(context, attrs);
}

无助于我的情况。 - Leo DroidCoder
3
Kotlin 版本: constructor() : this(null, null) } - Alqueraf
有一个简化的 Kotlin 版本可用:class ScrollingFABBehavior @JvmOverloads constructor(context: Context? = null, attrs: AttributeSet? = null) {...} - S-Sh

30

请确保使用自定义行为类的绝对路径而不是相对路径。

例如:

app:layout_behavior="net.company.myapp.view.behavior.TextViewBehavior"

5
在我的情况下,Android Studio将我的绝对路径更改为相对路径。我的包名称与ID不同,因此它导致了问题。 - P Fuster
8
尝试在行为子类中使用绝对路径,而不是相对路径,因为在运行时,Android可能无法解析相对路径。 - Abhishek

14
如果您正在使用 AndroidX(Android团队用于开发、测试、打包、版本化和发布Jetpack库的开源项目),那么您需要更新XML。

此处找到您的元素并替换:

Support:

android.support.design.widget.FloatingActionButton

AndroidX:

com.google.android.material.floatingactionbutton.FloatingActionButton

13

如果您在Android X中使用BottomSheet,则必须使用

app:layout_behavior="@string/bottom_sheet_behavior"

如果不是,则使用

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

9
如果您的应用程序具有不同于实际包结构的软件包ID,请确保指定自定义行为类的完整路径:
<android.support.design.widget.FloatingActionButton
        ...
        app:layout_behavior="com.example.xyzreader.ScrollingFABBehavior"/>

4
解决了。将 app:layout_behavior=".ScrollingFABBehavior"/> 改为 app:layout_behavior=".ui.ScrollingFABBehavior"/>

7
这将如何帮助任何人?谁知道您包的签名以及您犯了什么错误是不清楚的。 - Ishaan
1
其实他是对的,对我来说,放置整个包名比仅放置类名有效。 - Benjamin Ledet

4

我之前遇到了类似的问题,最终来到了这个页面。

我正在使用 Android X 上的 Bottom Sheet。

当我在应用程序中点击移动到新的 Fragment 时,出现以下错误消息并导致应用程序崩溃:运行时异常:“无法膨胀行为子类 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"

这一次修改意味着代码可以正常工作,没有崩溃,新的片段也如预期一样显示出来了。


4
如果你正在使用androidX,则你的根布局应该是:

如果你正在使用androidX,则你的根布局应该是:

<androidx.coordinatorlayout.widget.CoordinatorLayout

bottom_sheet的布局应包括:

app:layout_behavior="@string/bottom_sheet_behavior"

如果您不使用AndroidX或者使用support库,则根布局应该是:

<android.support.design.widget.CoordinatorLayout

bottom_sheet的布局应该包括:

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

1
在 Kotlin 中,不要忘记重写所有构造函数:
class CustomBehaviorBehavior @JvmOverloads constructor(
    context: Context? = null,
    attrs: AttributeSet? = null
) : CoordinatorLayout.Behavior<YourView>() {
//...
}

救救我吧!谢谢! - undefined

0
将应用程序主题设置为材料组件,可以在theme.xml中使用"parent="Theme.MaterialComponents.Light.NoActionBar"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接