Android 在另一个片段上添加片段onClickListener问题

Android 在另一个片段上添加片段onClickListener问题,android,android-fragments,Android,Android Fragments,我将向活动中添加一个片段,而不是替换当前片段(因为这与我想要的行为类型相对应) 我的问题是,单击不可见片段中视图所在的顶部片段(当前可见的片段)上的某个点,会在第二个不可见片段中的视图上触发onClick事件。 为什么会发生这种情况?我如何防止这种情况 这是我用来首先将ListView片段添加到活动的代码: @Override protected void onCreate(Bundle savedInstanceState) { ... if (savedInstanceSt

我将向活动中添加一个片段,而不是替换当前片段(因为这与我想要的行为类型相对应)

我的问题是,单击不可见片段中视图所在的顶部片段(当前可见的片段)上的某个点,会在第二个不可见片段中的视图上触发onClick事件。 为什么会发生这种情况?我如何防止这种情况

这是我用来首先将ListView片段添加到活动的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    if (savedInstanceState == null) {
        listFragment = new ListFragment ();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.frame_container, listFragment)
                .addToBackStack(listFragment .TAG)
                .commit();
    }

    ...

}
在同一个活动中,我将在列表片段的顶部添加第二个片段:

@Override
protected void onActivityResult(int requestCode, int resultCode,
                                Intent data) {
    ...
            createItemFragment = new CreateItemFragment();
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.frame_container, createItemFragment)
                    .addToBackStack(createItemFragment.TAG)
                    .commit();
    ...
}

如果您要添加一个片段,它将覆盖它下面的所有片段,因此如果您希望同时显示两个视图,这就是方法。当然,当两个视图都出现时,两个视图都会监听触摸事件。如果要保留片段但不显示它,请使用:

FragmentTransaction ft = getFragmentManager().beginTransaction()
ft.detach(fragment).commit();
这将在不破坏片段的情况下删除片段视图

你可以打电话

FragmentTransaction ft = getFragmentManager().beginTransaction()
ft.attach(fragment).commit();
稍后,将其重新附着到视图

或者,您可以将单击式侦听器更改为

public void onClick (View v){
    if(!v.isShown()){
        return;
    }
    //Stuff the listener should do.
}

您只需将以下属性添加到位于顶部的片段的XML根布局中-

android:clickable="true"

这将确保触摸事件不会传播到顶层以外的地方。

好吧,我认为最好的方法是将onClickListener设置到您在顶部片段上单击的位置视图。

如果您使用由金属胡须回答的android:clickable=“true”方式,并且您设置了任何ImageView的选择器的状态(见下文),那么您将发现错误:如果您单击其他空间位置,ImageView将更改状态

<ImageView
        android:id="@+id/mCollect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/specialprice_collect_selector" />
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/specialprice_collect_p" android:state_pressed="true"/>
    <item android:drawable="@drawable/specialprice_collect_n"/>
</selector>

不能让这些解决方案为我工作。无法使用“分离”选项,因为我不知道要添加到上面的片段是哪个片段。尝试了v.isShown(),但即使在顶部添加了第二个片段后,它仍然返回true,并且实际上不可见。另外,为了清楚起见,我确实需要片段与它下面的片段重叠。我只是想防止下面的片段成为“可操作的”。也就是说,当第二个可见片段可见时,我想阻止与它的任何交互。您使用的是哪种具有侦听器的视图?您可以在底部片段的视图上使用
view.setEnabled(false)
来禁用它。然后您可以替换
!v、 isShown()
带有
v.isEnabled()
。下面的视图是一个列表视图。我在它上面添加了一个不同的片段,当我单击可见片段中的一个空白处时,我基本上会触发ListView中某个项目的onItemClick事件。您是否将ListView适配器嵌套在fragment类中?提供一些代码可以帮助我找到一个具体的答案。像这样堆积碎片并不是一个好主意。为什么需要这样做?我在下面的回答中提到了原因。问题是,您的问题不需要片段保留在视图层次结构中。您可以通过正确使用捆绑来保存/恢复滚动位置。您可以在本地缓存数据,以避免过于频繁地获取图像。这是StackOverflow,所以你会发现有人会给你一个“答案”,帮助你做到这一点,但这只是一个糟糕的做法。如果片段不可见,则需要释放其资源。如果不这样做,您将成为用户设备上的一个坏公民,并且在您的应用程序进入后台后将被OS调度器关闭。我不确定这是否是解决我问题的“正确”解决方案,但这确实起到了作用,而且非常容易实现,所以我就这么做了。谢谢为什么这不是一个合适的解决方案?这本质上告诉系统,点击事件不应该传播到顶层以外的地方——如果您使用活动事件列表器覆盖视图,我认为这是正确的。我真没想到我能用这种方式使用这房子。再次感谢!给下层选民-有什么评论吗?这个答案有哪些地方可以改进/改进?这是一个很好的解决方案。您可能还希望在推送新片段之前调用getView().clearFocus(),以确保没有任何焦点,从而不会在新片段的顶部显示光标。不理解您的解决方案。。你能告诉我更多关于setOnClickListener的信息吗?我需要在哪里设置click listener?(谢谢)
mBootomLayout.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        }
    });