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