【问题标题】:HorizontalScrollView can host only one direct child?Horizo​​ntalScrollView 只能托管一个直接子级?
【发布时间】:2012-02-14 10:23:50
【问题描述】:

我基本上是在这个网站上:http://blog.velir.com/index.php/2010/11/17/android-snapping-horizontal-scroll/

但是我遇到了这个问题:

原因:java.lang.IllegalStateException:Horizo​​ntalScrollView 只能承载一个直接子级"

在这一行:

addView(internalWrapper);

这里是 myHorizo​​ntalScrollView 类:

public class MyHorizontalScrollView extends HorizontalScrollView {

int scrollToViewPos = 0;

public MyHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

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

public MyHorizontalScrollView(Context context) {
    super(context);
    init(context);
}

void init(Context context) {
    // remove the fading as the HSV looks better without it
    setHorizontalFadingEdgeEnabled(false);
    setVerticalFadingEdgeEnabled(false);
}

public void initViews(final MyHorizontalScrollView me, View[] children, int scrollToViewIdx, SizeCallback sizeCallback) {

    LinearLayout internalWrapper = new LinearLayout(getContext());
    internalWrapper.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    internalWrapper.setOrientation(LinearLayout.HORIZONTAL);
    addView(internalWrapper); 

    final int w = me.getMeasuredWidth();
    final int h = me.getMeasuredHeight();

    sizeCallback.onGlobalLayout();

    int[] dims = new int[2];
    scrollToViewPos = 0;
    for (int i = 0; i < children.length; i++) {
        sizeCallback.getViewSize(i, w, h, dims);
        internalWrapper.addView(children[i], dims[0], dims[1]);
        if (i < scrollToViewIdx) {
            scrollToViewPos += dims[0];
        }
    }

    new Handler().post(new Runnable() {
        public void run() {
            me.scrollBy(scrollToViewPos, 0);
        }
    });

}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    // Allow touch events.      
    return true;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    // Allow touch events.
    return true;
}

public interface SizeCallback {        
    public void onGlobalLayout();
    public void getViewSize(int idx, int w, int h, int[] dims);
}
}

xml 中的 MyHorizo​​ntalScrollView:

<?xml version="1.0" encoding="utf-8"?>
<com.yahya.LeftSlideMenu.MyHorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="0px"
android:fadingEdge="none"
android:fadingEdgeLength="0px"
android:padding="0px"
android:scrollbars="none" >

<LinearLayout
    android:id="@+id/top"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_margin="0px"
    android:background="#ffffffff"
    android:orientation="horizontal"
    android:padding="0px" >
</LinearLayout>

</com.yahya.LeftSlideMenu.MyHorizontalScrollView>

【问题讨论】:

    标签: android android-layout viewgroup android-viewpager swipe-gesture


    【解决方案1】:

    您缺少addView(internalWrapper);,这就是不可见的原因。

    【讨论】:

    • 我确实做到了...起初,我添加了这一行,但编译器给了我这个错误:“ E/AndroidRuntime(277): Caused by: java.lang.IllegalStateException: Horizo​​ntalScrollView can host only一个直接的孩子“
    • 它对我来说编译得很好:link
    • 但我不确定我是否理解你想要做什么。首先将孩子添加到 internalWrapper,然后删除它们并再次添加?
    • 好吧...起初我将它们设置为不可见,然后使它们可见并添加...然后我改变了主意,这就是它们仍然存在的原因,但我不认为那是有问题吗?
    • 你是对的。我工作得很好!但当时并没有,也许是关于清洁或我不知道的事情......但仍然做同样的事情......我希望它像 viewPager?这不可能吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 2013-06-08
    • 2013-05-17
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多