从Gridlayout Parent获取Linearlayout Childs并清除它们

时间:2018-02-12 13:33:43

标签: android android-layout

我的问题如下。我在网格布局中有3个线性布局。

在每个线性布局中有3个ImageView,总共9个。请参阅下面的xml:

 <GridLayout
    android:id="@+id/gridLayout"
    android:layout_width="0dp"
    android:layout_height="350dp"
    android:layout_marginTop="30dp"
    android:layout_weight="1"
    android:alignmentMode="alignMargins"
    android:background="@drawable/board"
    android:columnCount="3"
    android:columnOrderPreserved="false"
    android:rowCount="3"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">


    //Line 1----------

    <LinearLayout
        android:id="@+id/linearLayout_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_column="0"
        android:layout_row="0"
        android:orientation="horizontal">

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/shield00"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:layout_marginHorizontal="0dp"
            android:layout_marginVertical="25dp"
            android:adjustViewBounds="true"
            android:onClick="drop"
            android:scaleX="2.0"
            android:scaleY="2.0"
            android:tag="0" />

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/shield01"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:layout_marginHorizontal="9dp"
            android:layout_marginVertical="25dp"
            android:adjustViewBounds="true"
            android:onClick="drop"
            android:scaleX="2.0"
            android:scaleY="2.0"
            android:tag="1" />

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/shield02"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:layout_marginHorizontal="-1dp"
            android:layout_marginVertical="25dp"
            android:adjustViewBounds="true"
            android:onClick="drop"
            android:scaleX="2.0"
            android:scaleY="2.0"
            android:tag="2" />

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>

    //Line 2--------------

    <LinearLayout
        android:id="@+id/linearLayout_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_column="0"
        android:layout_row="1"
        android:orientation="horizontal">

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/shield10"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:layout_marginHorizontal="0dp"
            android:layout_marginVertical="25dp"
            android:adjustViewBounds="true"
            android:onClick="drop"
            android:scaleX="2.0"
            android:scaleY="2.0"
            android:tag="3" />

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/shield11"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:layout_marginHorizontal="9dp"
            android:layout_marginVertical="25dp"
            android:adjustViewBounds="true"
            android:onClick="drop"
            android:scaleX="2.0"
            android:scaleY="2.0"
            android:tag="4" />

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/shield20"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:layout_marginHorizontal="0dp"
            android:layout_marginVertical="25dp"
            android:adjustViewBounds="true"
            android:onClick="drop"
            android:scaleX="2.0"
            android:scaleY="2.0"
            android:tag="5" />

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_column="0"
        android:layout_row="2"
        android:orientation="horizontal">

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/shield12"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:layout_marginHorizontal="-1dp"
            android:layout_marginVertical="25dp"
            android:adjustViewBounds="true"
            android:onClick="drop"
            android:scaleX="2.0"
            android:scaleY="2.0"
            android:tag="6" />

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/shield21"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:layout_marginHorizontal="9dp"
            android:layout_marginVertical="25dp"
            android:adjustViewBounds="true"
            android:onClick="drop"
            android:scaleX="2.0"
            android:scaleY="2.0"
            android:tag="7" />

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/shield22"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:layout_marginHorizontal="-1dp"
            android:layout_marginVertical="25dp"
            android:layout_weight="1"
            android:adjustViewBounds="true"
            android:onClick="drop"
            android:scaleX="2.0"
            android:scaleY="2.0"
            android:tag="8" />

        <Space
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>


</GridLayout>

重点是,我想在游戏结束后清理ImageViews上的图片(此应用程序适用于游戏)。

我尝试从网格布局中获取线性布局作为子项,然后从每个线性布局中将每个ImageView作为子项。它不起作用,代码如下:

public void restart(View view){

        GridLayout gridLayout = (GridLayout) findViewById(R.id.gridLayout);
        clean(gridLayout);

    }


    //Clean ImageViews
    public void clean(GridLayout gridLayout){

        for(int i=0; i<gridLayout.getChildCount(); i++){
            LinearLayout linearLayout = (LinearLayout) gridLayout.getChildAt(i);

            for(int j=0; j<linearLayout.getChildCount(); i++){
                ((ImageView) linearLayout.getChildAt(j)).setImageResource(0);
            }
        }
    }

当调试器指示我时,崩溃出现在“((ImageView)linearLayout.getChildAt(j))。setImageResource(0);”线。

另外,我已经使用了“removeAllViews()”方法。它会删除所有图片但不允许在新游戏启动时再次删除它们(除非应用程序重新启动,这对我不起作用)。

知道如何实现这个目标吗?

非常感谢你提前= D

2 个答案:

答案 0 :(得分:1)

您尝试将第二个for循环中的每个子布局转换为错误的ImageView,因为某些子元素的类型为“Space”。

尝试在第二个for循环中添加此内容以检查视图是否为ImageView

if (view instanceof ImageView) {
    ImageView imageView = (ImageView) view;

下次还要在问题中包含堆栈跟踪

答案 1 :(得分:1)

你在这里遇到两个错误:

1:

在第二个loop

j ++ 替换 i ++

for(int j=0; j<linearLayout.getChildCount(); i++){}

你只需要替换这个

for(int j=0; j<linearLayout.getChildCount(); j++){}

<强> 2

您正在遍历LinearLayout内部的循环,其中包含ImageView以及Space。我们你必须检查childView的类类型。

为此,您可以使用instanceof关键字。

您只需替换此代码即可。

//Clean ImageViews
    public void clean(GridLayout gridLayout){

        for(int i=0; i<gridLayout.getChildCount(); i++){
            LinearLayout linearLayout = (LinearLayout) gridLayout.getChildAt(i);

            for(int j=0; j<linearLayout.getChildCount(); j++){
                Object obj = linearLayout.getChildAt(j);
                if (obj instanceof ImageView) {
                    ImageView imageView = (ImageView) linearLayout.getChildAt(j);
                    imageView.setImageResource(0);
                }
            }
        }
    }