android-fragments 将片段添加到另一个片段之上onClickListener问题

0mkxixxg  于 2022-11-13  发布在  Android
关注(0)|答案(5)|浏览(165)

我在添加一个片段到Activity中,而不是替换当前片段(因为这对应于我想要的行为类型)。
我的问题是,在顶部片段(当前可见的片段)上的某个位置(不可见片段中的视图所在的位置)单击,会导致第二个不可见片段中的视图上的onClick事件触发。为什么会发生这种情况?我如何才能防止这种情况?
下面是我用来将ListView片段添加到Activity中的第一个代码:

@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();
    ...
}
vktxenjb

vktxenjb1#

您可以将以下属性添加到前面的片段的XML根布局中-

android:clickable="true"

这将确保触摸事件将不会传播得比顶层更远。

c86crjj0

c86crjj02#

如果你要添加一个片段,它会覆盖它下面的所有片段。所以,如果你想同时显示两个视图,这是一种方法。自然地,当两个视图都存在时,两个视图都会监听触摸事件。如果你想保留片段但不显示它,请用途:

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.
}
suzh9iv8

suzh9iv83#

我认为最好的方法是将onClickListener设置为您在顶部片段上单击的locateView。
如果您使用Metal Beard回答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>

如果在顶部片段上点击的视图是mBootomLayout,则只需这样做:

mBootomLayout.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        }
    });
6xfqseft

6xfqseft4#

I had also faced a similar issue. I have solved it by applying setOnClickListener to each view separately. 
Below example:
 binding.tvSchedule.setOnClickListener{
                openSchedule()
            }
    
**Note**: Do not implement View.OnClickListener to your fragment Class.
3pvhb19x

3pvhb19x5#

希望这还不算太晚。我相信这可能还是有帮助的。
您应该做的是获取片段的根视图,将其命名为setOnTouchListener,实现View.OnTouchListener并在其onTouch方法中返回true

相关问题