当只有一个直接子项时,Java返回“ScrollView只能托管一个直接子项”

时间:2017-07-31 07:27:19

标签: java android exception scrollview

我自定义ScrollView作为View的主要layout,其中包含一个FrameLayout,其他View都放在里面它。它看起来像这样(这是sm_layout.xml):

<com.effeleven.utils.CustomScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/scrollView"
    android:background="@color/white"
    android:clickable="true">

    <FrameLayout...>

</com.effeleven.utils.CustomScrollView>

当我使用默认的Android ScrollView时,我没有抛出此异常。现在我需要一个自定义的,因为我需要处理ScrollView内的滚动事件(我有mapFragmentListView,我不能用任何东西替换,因为我关注设计模式)。什么可能导致异常,因为我的CustomScrollView只包含一个FrameLayout,就像之前的ScrollView一样?

这是我的CustomScrollView课程:

public class CustomScrollView extends ScrollView {

public CustomScrollView(Context context) {
    super(context);
    LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    layoutInflater.inflate(R.layout.sm_layout, this, true);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    final int action = ev.getAction();
    switch (action)
    {
        case MotionEvent.ACTION_DOWN:
            super.onTouchEvent(ev);
            break;

        case MotionEvent.ACTION_MOVE:
            return false;

        case MotionEvent.ACTION_CANCEL:
            super.onTouchEvent(ev);
            break;

        case MotionEvent.ACTION_UP:
            return false;

    }

    return false;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    super.onTouchEvent(ev);
    return true;
}
}

2 个答案:

答案 0 :(得分:3)

CustomScrollView 中,您使用LayoutInflater包含另一个布局,这会导致问题。尝试评论布局并查看它是否有效。

答案 1 :(得分:3)

阅读 ScrollView

  

允许放置在其中的视图层次结构的视图组   滚动。滚动视图可能只有一个直接子项放在其中   

<强>原因

layoutInflater.inflate(R.layout.sm_layout, this, true);

您已将多个xml属性包含为ScrollView的子项。你持有 sm_layout.xml 。你应该从Class 中删除它。