17

次の例のようなレイアウト xml があります。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/tile_bg" >

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingTop="10dp" >

    <LinearLayout
        android:id="@+id/layout_0"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <!-- view stuff here -->
    </LinearLayout>

    <!-- more linear layouts as siblings to this one -->

</LinearLayout>

私は実際には約 7 つの LinearLayout アイテムを持っており、それぞれ ID が layout_0 などから増加しています。ルート LinearLayout の下にあるすべての LinearLayout アイテムを取得できるようにしたいと考えています。ルート ID に ID を付けて、他のすべてを ID で検索する必要がありますか、それともタイプ別に取得できますか。

レイアウトを膨らませるために使用するコードは次のとおりです。

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

ViewGroup の子を反復できることをどこかで読みましたが、これは View にすぎません。

タイプごとにたくさんの子供を取得する最良の方法は何ですか?

4

7 に答える 7

34

これにより、正しい軌道に乗るはずです。

LinearLayout rootLinearLayout = (LinearLayout) findViewById(R.id.rootLinearLayout);
int count = rootLinearLayout.getChildCount();
for (int i = 0; i < count; i++) {
    View v = rootLinearLayout.getChildAt(i);
    if (v instanceof LinearLayout) {
        ...
    }
}
于 2012-12-14T22:19:01.483 に答える
3

レイアウトのルート要素が、または他のレイアウトのViewGroupようなサブクラスであることがわかっている場合は、結果ビューを安全にキャストできます。LinearLayout

ViewGroup vg = (ViewGroup)view;

必要に応じて使用します。ルート コンテナに常に1 つのタイプのレイアウトのみを使用することがわかっている場合は、そのタイプにキャストできます。つまり、次のようになります。

LinearLayout vg = (LinearLayout)view;
于 2012-12-14T22:25:12.440 に答える
1

LinearLayout ルートに ID を追加する必要があります。

<LinearLayout
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingTop="10dp" >

    <LinearLayout
        android:id="@+id/layout_0"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <!-- view stuff here -->
    </LinearLayout>

    <!-- more linear layouts as siblings to this one -->

</LinearLayout>

次に、通常どおりレイアウト全体を膨張させます。

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

あなたのルートをつかむLinearLayout

LinearLayout root = (LinearLayout) view.findViewById(R.id.root);

LinearLayout[] children = new LinearLayout[root.getChildCount()];

for (int i = 0; i < root.getChildCount(); i++) {
    children[i] = (LinearLayout) root.getChildAt(i);
}
于 2012-12-14T22:22:20.177 に答える
1

この DFS メソッドの引数としてルート ビューを渡します。

private List<LinearLayout> mArr = new ArrayList<LinearLayout>();

private void getLinearLayouts(ViewGroup parent) {
    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View child = parent.getChildAt(i);
        if (child instanceof ViewGroup) {
            getLinearLayouts((ViewGroup) child);
            if (child instanceof LinearLayout)
                mArr.add((LinearLayout) child);
        }
    }
}
于 2012-12-14T22:23:33.077 に答える