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

时间:2014-07-15 17:57:13

标签: android android-fragments

片段添加到活动而不是替换当前片段(因为这对应于我想要的行为类型)。< / 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();
    ...
}

3 个答案:

答案 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) {
        }
    });