StackOverflowError when inflating a custom view that contains its own views
I have a fragment where I inflate "fragment_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>
As you can see the fragment panel contains a custom "BoardView" from where I want to load the following "view_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>
My custom view has two scrolling views (I use it for panning) and I want to be able to reuse it in other layouts. BoardView extends the (vertical) scrolling appearance in this way:
public class BoardView extends ScrollView
When I use it offline it inflates fine and I can findViewById () view the scrolls in the inflated layout. But when I use it in a layout tree (like a fragment) I run into problems.
In the snippet, I inflate the layout tree like this:
View view = inflater.inflate(R.layout.fragment_board, container, false)
From a snippet, I can findViewById () the outer (vertical) scroll view, but findViewById () returns null for the inner (horizontal) scroll.
In BoardView I inflate like this:
View view = inflate(getContext(), R.layout.view_board, this);
As I said, I can find both kinds of scrolling fine when they are pumped up on their own, but when they are pumped up as part of a fragment, I get a StackOverflowError.
It is clear why: first I inflate the fragment and then inflate the same XML in the view again, which causes another kind of inflation, etc. I am getting a circular link here. Problem I can't figure out how I can add an inner (horizontal) scroll view to an already existing layout. I think I need to somehow merge or inflate the layouts manually, but I can't figure out how.
Here are some links (which didn't work in my case):
- Android - creating a custom (composite) component
- How to properly populate XML-Layout-File inside CustomGroupGroup?
- Create your own look by inflating the layout .
- InvocationTargetException while inflating XML android
- stack overflow
Can anyone suggest what I should do. If possible, I would like the BoardView to act as a generic component that I can connect to the layout tree where needed.
Since Android [per one of the links above] does not officially support composite components, would it be better to drop XML layouts for internal views and add them to the code?
Please check if something like this fixes:
fragment_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">
<com.app.BoardView
android:id="@+id/view_board"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
view_board.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>
More information on using MERGE and INCLUDE