当前位置: 首页 > 知识库问答 >
问题:

StackOverflower膨胀包含自己视图的自定义视图时出错

颛孙嘉玉
2023-03-14

我有一个片段,我在其中膨胀“Fragment\u board.xml”:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

    <view
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.app.BoardView"
        android:id="@+id/view_board"/>
</FrameLayout>

如您所见,fragment\u board包含一个自定义视图“BoardView”,我想从中加载以下“view\u board.xml”:

<com.app.BoardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    android:fadingEdge="none"
    android:requiresFadingEdge="none"
    android:overScrollMode="always"
    android:id="@+id/board_scrollview_vertical">

    <android.widget.HorizontalScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scrollbars="none"
        android:fadingEdge="none"
        android:requiresFadingEdge="none"
        android:overScrollMode="always"
        android:id="@+id/board_scrollview_horizontal"
        android:foregroundGravity="left">

    </android.widget.HorizontalScrollView>

</com.app.BoardView>

我的自定义视图包含两个滚动视图(我使用它进行平移),我希望能够在其他布局中重复使用它。BoardView扩展了外部(垂直)滚动视图,如下所示:

public class BoardView extends ScrollView

当我独立使用它时,它会膨胀得很好,我可以在膨胀的布局中找到ViewById()两个滚动视图。但是当我在布局树(例如片段)中使用它时,我会遇到问题。

在片段中,我将布局树膨胀如下:

View view = inflater.inflate(R.layout.fragment_board, container, false)

从片段中,我可以找到外部(垂直)滚动视图的findViewById(),但对于内部(水平)滚动视图,findViewById()返回null。

在BoardView中,我像这样充气:

View view = inflate(getContext(), R.layout.view_board, this);

如上所述,我可以发现两个滚动视图在单独膨胀时都很好,但当作为片段的一部分膨胀时,我得到了StackOverflowError。

原因很清楚:我首先在片段中膨胀,然后我再次在视图中膨胀相同的XML,这会触发视图的另一次膨胀等等。我在这里得到了一个循环引用。问题我无法弄清楚如何将内部(水平)滚动视图添加到已经存在的布局中。我认为我需要以某种方式合并或手动膨胀布局,但我无法弄清楚如何。

以下是一些参考文献(对我的情况没有帮助):

  • Android-编写自定义(复合)组件
  • 如何在Custom ViewGroup中正确膨胀XML-Layout-File?
  • 通过膨胀布局来创建自定义视图?
  • InvocationTargetException关于膨胀xml-android
  • Android:膨胀布局时带有InvocationTargetException的StackOverFlowError

有人能建议我应该做什么吗?如果可能的话,我希望BoardView作为一个通用组件工作,我可以在需要的地方将其插入布局树中。

由于Android[根据上面的一个参考文献]不正式支持复合组件,我的最佳选择是删除内部视图的XML布局并将其添加到html" target="_blank">代码中吗?

共有1个答案

唐元青
2023-03-14

请检查这样的东西是否解决了问题:

fragment\u板。xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

    <com.app.BoardView
        android:id="@+id/view_board"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

view\u板。xml

 <merge xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    android:fadingEdge="none"
    android:requiresFadingEdge="none"
    android:overScrollMode="always"
    android:id="@+id/board_scrollview_vertical">

    <android.widget.HorizontalScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scrollbars="none"
        android:fadingEdge="none"
        android:requiresFadingEdge="none"
        android:overScrollMode="always"
        android:id="@+id/board_scrollview_horizontal"
        android:foregroundGravity="left">

    </android.widget.HorizontalScrollView>

</merge>

有关使用MERGE和INCLUDE的更多信息

 类似资料:
  • 那么如何对此?要扩展什么才能只调用setContentView()或setLayoutResource()? 我看了很多这样的答案,但没有一个符合我的问题。

  • 我试图在我的应用程序上实现谷歌登录。 工作正常,但当我尝试登录时,我的logcat上出现以下错误: 2018-10-04 14:55:14.784 16313-16313/? I/AppCompatDelegate:无法实例化自定义视图充气器android。支持v7。应用程序。这是充气机。回到违约状态。JAVAlang.ClassNotFoundException:android。支持v7。应用程

  • 还有人觉得这有点令人沮丧或有什么建议吗?从基类中膨胀相同的布局似乎并不罕见。

  • 当获得Release apk时,我会在应用程序的所有活动中获得此错误日志 null 谢谢你。

  • 英文原文:http://emberjs.com/guides/views/customizing-a-views-element 视图在页面上表现为一个单一的DOM元素。通过修改tagName属性,可以改变视图生成的元素的类型。 1 2 3 App.MyView = Ember.View.extend({ tagName: 'span' }); 另外,还可以通过设置一个字符串数组到clas

  • 因此,我的日常用户中约有1%经常遇到NavigationView异常,这是由于找不到图像资源造成的。我觉得很奇怪,99%的其他用户都很好。我希望在版本迭代中更新依赖项可以解决这个问题,但不幸的是,这个错误已经在我的Crashlytics日志中保留了6次迭代,这是影响我的用户的最严重的崩溃。 显而易见的是,它只适用于较旧的设备,但这是一个错误的假设。它不是特定于设备的,也不是特定于版本的。尽管可以指