我将片段添加到活动而不是替换当前片段(因为这对应于我想要的行为类型)。< / p>
我的问题是,点击顶部片段(当前可见的片段)上的一个点(非可见片段中的视图所在的位置)会导致第二个视图中的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();
...
}
答案 0 :(得分:31)
您可以将以下属性添加到顶部ago的片段的XML根布局 -
android:clickable="true"
这将确保触摸事件不会比顶层传播更多。
答案 1 :(得分:2)
如果你要添加一个片段,它会重叠它下面的所有片段所以如果你想同时显示两个视图,这就是这样做的方法。当然,两种观点都会听取触摸事件。如果要保留片段但不显示它,请使用:
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.
}
答案 2 :(得分:0)
好吧,我认为最好的方法是将onClickListener设置为顶部片段上单击的locateView。
如果你使用的方式 android:clickable =&#34; true&#34;由The Metal Beard回答,并且您还设置了任何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>
如果点击顶部片段的视图是mBootomLayout,就这样做:
mBootomLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});