遍历 GridLayout 子项以隐藏 3x3 板的 ImageViews

Posted

技术标签:

【中文标题】遍历 GridLayout 子项以隐藏 3x3 板的 ImageViews【英文标题】:Iterate through GridLayout childs to hide ImageViews of 3x3 board 【发布时间】:2019-03-22 13:43:04 【问题描述】:

我一直试图隐藏 GridLayout 3x3 板的所有图像视图。我尝试使用循环遍历布局的所有子元素和 imageView.setImageDrawable(null);

注意:以下代码已放在 playAgain(View view) 按钮方法中。

public void playAgain(View view)

        Button playAgainButton = (Button) findViewById(R.id.playAgainButtonID);
        TextView winnerTextView = (TextView) findViewById(R.id.winnerTextView);
        playAgainButton.setVisibility(View.INVISIBLE);


        winnerTextView.animate().translationYBy(-100);

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

       for(int i=0; i<gridLayout.getChildCount(); i++)

           ImageView imageView = (ImageView) gridLayout.getChildAt(i);
           imageView.setBackgroundResource(0);
       

after pressing the button the app shows this error

这是来自 logcat 的日志:

E/androidRuntime: 致命异常: main 进程:com.rootcomp.bills.joincoin,PID:10140 java.lang.IllegalStateException:无法执行 android:onClick 的方法 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390) 在 android.view.View.performClick(View.java:6256) 在 android.view.View$PerformClick.run(View.java:24701) 在 android.os.Handler.handleCallback(Handler.java:789) 在 android.os.Handler.dispatchMessage(Handler.java:98) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Method.invoke(本机方法) 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 在 android.view.View.performClick(View.java:6256) 在 android.view.View$PerformClick.run(View.java:24701) 在 android.os.Handler.handleCallback(Handler.java:789) 在 android.os.Handler.dispatchMessage(Handler.java:98) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 引起:java.lang.ClassCastException: android.support.v7.widget.GridLayout 无法转换为 android.widget.GridLayout 在 com.rootcomp.bills.joincoin.MainActivity.playAgain(MainActivity.java:99) 在 java.lang.reflect.Method.invoke(本机方法) 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 在 android.view.View.performClick(View.java:6256) 在 android.view.View$PerformClick.run(View.java:24701) 在 android.os.Handler.handleCallback(Handler.java:789) 在 android.os.Handler.dispatchMessage(Handler.java:98) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 2018-10-18 01:48:21.514 1740-5247/system_process W/ActivityManager: 强制完成活动 com.rootcomp.bills.joincoin/.MainActivity

【问题讨论】:

如果没有其他方法,你可以写imageView.setVisibility(View.INVISIBLE); 这样你甚至可以跳过演员表ImageViewgridLayout.getChildAt(i).setVisibility(View.INVISIBLE); 我认为问题在于我用来遍历 GridLayout 的所有子项的 for 循环。当我注释掉循环行并在尝试使用循环时出现崩溃时,它工作正常。刚刚使用 imageView.setVisibility(View.INVISIBLE);可悲的是仍然是同样的错误。 然后在Logcat中查找crash log。它说什么? for(int i=0; i<gridlayout.getchildcount i gridlayout.getchildat> 还是不行 :(.</gridlayout.getchildcount> 嗯...这不是我要问的。你使用 Android Studio 吗? 【参考方案1】:

您似乎正在投射错误版本的 GridLayout。

java.lang.ClassCastException: android.support.v7.widget.GridLayout 无法在 com.rootcomp.bills.joincoin.MainActivity.playAgain(MainActivity.java:99) 处转换​​为 android.widget.GridLayout

您是在 xml 中使用支持版本,而在代码中使用不支持版本吗?

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

它们都被称为 GridLayout,但来自不同的库。

【讨论】:

现在将“

以上是关于遍历 GridLayout 子项以隐藏 3x3 板的 ImageViews的主要内容,如果未能解决你的问题,请参考以下文章

Ionic / Angular 离子项,带有按钮单击以选择隐藏选定的离子项

如何在 JavaScript 中的子项之间遍历以从 JSON 创建面包屑 UI

为啥GridLayoutGroup添加子项后没有办法立即获取到子项的位置

使用 Swift 遍历 Firebase 中的嵌套快照子项

CreateJS/AnimateCC 遍历库 MovieClip 的子项

在制表器中显示/隐藏或切换嵌套表子项