遍历 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);
这样你甚至可以跳过演员表ImageView
:gridLayout.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添加子项后没有办法立即获取到子项的位置