- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在通过 setVisibility(View.INVISIBLE)
隐藏 View 。稍后,当我尝试通过 setVisibility(View.VISIBLE)
以不同的方法再次显示 View 时,出现以下异常
03-28 01:32:05.450: E/AndroidRuntime(20895): FATAL EXCEPTION: main
03-28 01:32:05.450: E/AndroidRuntime(20895): java.util.ConcurrentModificationException
03-28 01:32:05.450: E/AndroidRuntime(20895): at java.util.HashMap$HashIterator.nextEntry(HashMap.java:796)
03-28 01:32:05.450: E/AndroidRuntime(20895): at java.util.HashMap$KeyIterator.next(HashMap.java:823)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:946)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:948)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:948)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:948)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:948)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:948)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.view.ViewRoot.handleDragEvent(ViewRoot.java:3027)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.view.ViewRoot.handleMessage(ViewRoot.java:2185)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.os.Looper.loop(Looper.java:132)
03-28 01:32:05.450: E/AndroidRuntime(20895): at android.app.ActivityThread.main(ActivityThread.java:4028)
03-28 01:32:05.450: E/AndroidRuntime(20895): at java.lang.reflect.Method.invokeNative(Native Method)
03-28 01:32:05.450: E/AndroidRuntime(20895): at java.lang.reflect.Method.invoke(Method.java:491)
03-28 01:32:05.450: E/AndroidRuntime(20895): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
03-28 01:32:05.450: E/AndroidRuntime(20895): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
03-28 01:32:05.450: E/AndroidRuntime(20895): at dalvik.system.NativeStart.main(Native Method)
当我注释掉将可见性改回可见的行时,我没有得到异常。
我一开始以为是其他一些代码遍历hashmap导致的异常,然而,我在遍历我使用的hashmap时没有做任何修改,我也没有多线程,这似乎是最此异常的常见原因。当我不改变可见性时,我也没有得到异常。
编辑:
异常发生在自定义 fragment 中。下面是我迭代散列图 (mWidgetConfig
) 的代码,它包含有关我尝试恢复的自定义小部件的配置信息。 HashMap 是 fragment 中的公共(public)变量。
在 fragment 创建的OnDragListener
中,我根据某个拖动操作更新hashmap,如下所示:
// Update the widget configuration of the fragment that created this listener
mFragment.mWidgetConfig.put(startCircleTag, "0");
我还遍历 hashmap 以检查特定条件,但我在迭代期间不做任何修改:
Iterator<String> keySetItr = mFragment.mWidgetConfig.keySet().iterator();
while(keySetItr.hasNext()) {
String tag = keySetItr.next();
if(mFragment.mWidgetConfig.get(tag).equals((String) destSocket.getTag())) {
// do something, though no modification of the hashmap
break;
}
}
此外,我在尝试恢复小部件配置时在 fragment 本身中进行了一次迭代。下面是我用来根据 HashMap 配置小部件的代码:
public void configureWidgets() {
resetWidgets();
Iterator<String> keySetItr = mWidgetConfig.keySet().iterator();
while(keySetItr.hasNext()) {
String tag = keySetItr.next();
Integer value = Integer.parseInt(mWidgetConfig.get(tag));
ImageView destSocket = null;
switch(value) {
case 0:
// The circle will not be connected to any socket
continue;
case 1:
destSocket = mSocket1;
break;
case 2:
destSocket = mSocket2;
break;
case 3:
destSocket = mSocket3;
break;
}
ImageView startCircle = (ImageView) mLayout.findViewWithTag(tag);
ImageView startPlug = (ImageView) mLayout.findViewWithTag(tag + "_plug");
// Replace the drawable of destSocket
destSocket.setBackgroundDrawable(getActivity().getResources().getDrawable(R.drawable.socket_plugged));
// Hide plug view
startPlug.setVisibility(View.INVISIBLE);
// Draw a line between the start circle view and the destination socket view
mConnectionLinesView.addLine(startCircle, destSocket);
}
}
public void resetWidgets() {
// Remove all lines
mConnectionLinesView.removeLines();
// Show all eventually previously hidden plugs
//mPlug1.setVisibility(View.VISIBLE);
//mPlug2.setVisibility(View.VISIBLE);
//mPlug3.setVisibility(View.VISIBLE);
// Set to backround drawable of the socket to the initial one
mSocket1.setBackgroundDrawable(getActivity().getResources().getDrawable(R.drawable.socket).mutate());
mSocket2.setBackgroundDrawable(getActivity().getResources().getDrawable(R.drawable.socket).mutate());
mSocket3.setBackgroundDrawable(getActivity().getResources().getDrawable(R.drawable.socket).mutate());
}
只要在代码中使用设置上面“插头”可见性的行,我就会得到异常。
解决方案
抛出异常的原因是我调用了 OnDragListener
的 DragEvent.ACTION_DRAG_ENDED
case 语句中的配置方法。当我将相同的代码放入 DragEvent.ACTION_DROP
case 语句时,不会抛出异常。不知道为什么。谢谢大家的帮助
最佳答案
据我了解,这是由 ViewGroup
实现细节引起的。并且与多线程无关。
当拖动开始时,ViewGroup
创建一个必须通知有关 ACTION_DRAG_ENDED
事件的 subview 的 HashSet。这是一组可见的 child 。当子项可见性发生变化时,相应的 ViewGroup
会修改该集合(如果其可见性为 VISIBLE
,则添加一个子项)。在您的情况下,它发生在该集合的迭代过程中。
想一想,对您来说最简单的解决方案是推迟可见性更改。
view.post(new Runnable() {
public void run() {
view.setVisibility(View.VISIBLE);
}
});
当您将代码放入 ACTION_DROP
case 语句时,不会发生异常,因为在您更改 View 可见性时该集合未被迭代。
有关详细信息,请参阅 ViewGroup.dispatchDragEvent(DragEvent)源代码。
关于Android - setVisibility 导致 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9899382/
我有一个代码,当我单击 jButton 时,它应该设置为不可见,而另一个已设置为 FALSE 的 JButton 应该为 TRUE,setVisible(true) 不起作用。 buttonGrid[
我看到了一些关于这个的帖子,我明白了这个问题。但是怎么绕过去呢?我有 ListView 和可以展开的项目,但是一旦 View 消失,它就不会再可见,除非它有可用空间。如何创造这个空间? private
JFrame 在循环中无法正确显示。代码:- import javax.swing.*; import java.awt.event.*; import java.awt.*; import j
下面的代码应该重置框架gameFrame: private void reset() { moveCount = 0; gameFrame.setVisible(false);
请看下图来理解问题: 如您所见,有一个 RelativeLayout 包含一个自定义 View 和一个 LinearLayout。 在它们之间,还有另一个 View,Visibility 被设置为 G
我有一个 JScrollPane包含 JPanel然后包含一些自定义组件,它们是 JPanel 的扩展(它们都是同一类型)。此 JScrollPane 在包含 JFrame 之前设置为不可见显示。 当
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我是 JFrame 的新手,我正在尝试做一个项目,如果按“注销”按钮,则可以完美执行以下代码, public void actionlogout() { lButton.addActionLi
我试图隐藏除 1 之外的所有 jList,它是从 jcomboBox (cbLists) 的索引中获得的,它并没有真正隐藏 jLists,就像禁用而不是隐藏一样,我需要它隐藏所有内容,就像完全不可见一
你能帮我吗?我正在尝试创建一个菜单,只需按一下按钮即可显示项目。我想我应该使菜单项visible:false,然后在MainActivity中切换这个属性。但我做不到正确的事。我需要 3 个新菜单项。
我想知道,这样做会更有效率吗: setVisible(false) // if the component is invisible 或者像这样: if(isVisible()){
简单介绍一下我在做什么。 我根据用户登录的帐户类型授予不同的功能。 用户的帐户类型将通过 Firebase 数据库中的 Firebase 引用检索。如果您查看此图像,就会看到箭头指示。这是显示帐户类型
我在处理程序中隐藏了一个按钮(这是在我使其在应用程序的另一种状态下可见之后)。处理程序从正在运行的线程接收消息,然后更新 GUI。 问题是附近的(不是全部)按钮和 TextView 也从屏幕上消失了。
我有一个带有 jcheckbox 和 jtextfield 的 jframe(它有更多组件)。 我将标签设置为 setVisible(false),当复选框被选中时,它应该使标签可见。它确实如此,但您
这是我的布局:
我是 android 开发的新手。我在 LinearLayout 中包含一个网格,组成网格的每个项目都是一个按钮。当用户按下这些按钮中的任何一个时,我希望此 LinearLayout 不可见。 这是我
我在抽屉中使用 NavigationView 并且 Menu 中有一个项目具有指向 的 app:actionLayout 属性>LinearLayout 包含一个 TextView,并且 TextVi
我有一个 LinearLayout,我希望能够通过单击“更多详细信息”链接来显示/隐藏它。我通过调用来做到这一点 moreDetailsSection.setVisibility(View.VISIB
在 JavaFX 中,如果我有一个包含 2 个 VBox 元素的场景,并且每个 VBox 中都有多个 Label。 如果我将顶部的VBox设置为invisible,为什么底部的VBox不上移顶部的场景
所以我一直在论坛中寻找如何做到这一点,但我发现没有任何效果。当我在图像按钮上调用 setVisibility() 时,该按钮不受影响。下面是 onCreate 方法中的代码,当我运行应用程序时,两个按
我是一名优秀的程序员,十分优秀!