点击片段会调用其后面的活动。

25

我猜这可能是非常简单的问题,也许是ListView或Fragment中的某个设置。但我已经寻找解决方案几个小时了,还是没找到。 所以.. 我有一个像这样的ListView:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:isScrollContainer="true">

<ListView 
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#fffafa"
    />

</RelativeLayout>

当用户点击列表项目时,我会将其替换为类似于这样的片段

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
    ft.replace(R.id.content, newFragment);

    ft.addToBackStack(null);
    ft.commit();
如果我在列表上点击项目,整个列表将被一个由按钮和几个文本字段组成的碎片(*)所替换。 该碎片可以正确地用有关该项的信息替换listView。当我按下返回键时,它确实可以将列表视图带回。
问题在于,如果我单击*的背景,它会表现得好像我单击了在其后面的列表..并将有关该项的碎片带到前面。我可以无限地在背景上点击以带来其他碎片。我可以通过点击返回、返回来挖掘回到列表。
为什么这个碎片是透明的?如何修复它?
5个回答

29

我通过在表现为“透明”的元素中添加android:clickable="true"解决了类似的问题。使其可点击确保了点击事件由该元素处理,而不是传递到下面的视图。


2
问题在于它无法停止空白区域的触觉反馈。 - Sreedevi J

13

所以,我遇到了完全相同的问题,但我仍然不知道原因,但请确保将 android:clickable="true" 添加到第二个片段布局的roovView中。

就像这样:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:clickable="true"
android:orientation="vertical">
.....any content for your item (2nd fragment).....
</LinearLayout>

8
我认为问题在于replace方法没有替换ListView,它只替换容器中的其他片段。在这种情况下,没有其他片段。因此,您实际上是将您的片段添加到ListView之上,因为RelativeLayout允许视图相互叠加。当您单击片段时,您并没有完全处理它,因此它会通过到基本视图,即ListView
一个简单、快速而不太好的解决方案是检索ListView对象,然后从容器中删除它或将其可见性设置为GONE。更好的解决方案是使用ListFragment,它应该显示预期的结果。

我重新设计了它,使列表成为起始片段。然后重写了obBackPressed,以便在(manager.getBackStackEntryCount() == 1)的情况下阻止将此列表从片段返回堆栈中移除,现在它运行得非常好。谢谢! - AndroidGecko
我遇到了相同的问题,但是所有片段都有这个问题。我以与ListView添加方式相同的方式添加了我的片段:通过xml。我改为使用FragmentManager来填充片段,现在一切正常。因此,问题在于任何没有由FragmentManager添加的内容都不会被删除。 - Jason Robinson
如果您没有ListFragment,那么该怎么办? - Ahmed
2
@Ahmed。问题在于片段中的视图无法捕获触摸事件,因此触摸事件会一直向下传递到找到可以处理它的视图为止。一个有点丑陋的解决方案是将“onTouchListener”设置为“Fragment”的根“View”,并仅返回“true”。这将阻止所有触摸事件在单击此片段时传递到其他视图。 - DeeV
我尝试替换一个片段,但对我来说这并不能解决问题。可能是因为其他原因导致焦点无法停留在片段上。 - Ahmed
显示剩余2条评论

4
将 clickable 属性设置为 true,以便仅在前台片段上消耗点击事件。
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:clickable="true" />

2
在前台Fragment的FrameLayout标签中设置android:clickable="true",这对我有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接