11

私のxmlレイアウトには、次のような子を配置するカスタムビューがあります。

<com.proj.layouts.components.ScrollLayout
    android:id="@+id/slBody"
    android:layout_width="700dp"
    android:layout_height="400dp">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child1"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child2"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child3"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child4"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child5"/>
</com.proj.layouts.components.ScrollLayout>

もう少し説明させてください。子供向けに、既にコンテナが定義されているカスタムScrollViewを作成しました。だから私はそれらをそこに置きたいだけです。

public class ScrollLayout extends LinearLayout {
    // View responsible for the scrolling
    private FrameLayout svContainer;
    // View holding all of the children
    private LinearLayout llContainer;

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

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

    private void init() {
        super.removeAllViews(); // kill old containers


        svContainer = new HorizontalScroll(getContext());
        llContainer = new LinearLayout(getContext());
        llContainer.setOrientation(orientation);
        svContainer.addView(llContainer);

        svContainer.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        llContainer.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

        addView(svContainer);


    }

    ... I left out the part which takes care of the scroll event ...
}

llContainerにChild*を追加する方法は何ですか?

4

3 に答える 3

11

LinearLayoutすべての子をからに追加してみませんScrollLayoutか? これはonFinishInflate()メソッドで行う必要があります。

for (int i = 0; i<getChildCount(); i++)
{
    View v = getChildAt(i);
    removeViewAt(i);
    llContainer.addView(v);
}

XML ファイルに構造を記述すると、すべての内部ビューがカスタム レイアウトの子になります。に置き換えるだけLinearLayoutです。

于 2012-02-13T11:22:17.943 に答える
5

Jin35の答えには欠陥があることに同意します。また、svContainer が追加されているため、getChildCount() == 0 になるまで続行できません。

init() の終わりまでに、getChildCount() == 1 です。svContainer は追加されていますが、TextView は追加されていないためです。onFinishInflate() の終わりまでに、TextView が追加され、位置 1、2、3、4、および 5 にあるはずです。しかし、位置 1 のビューを削除すると、他のインデックスはすべて 1 減少します (標準のリスト動作)。

私は提案します:

@Override
protected void onFinishInflate() {
    super.onFinishInflate();

    View v;
    while ((v = getChildAt(1)) != null) {
        removeView(v);
        llContainer.addView(v);
    }
}
于 2015-09-27T09:59:00.470 に答える