Java Can';t获取活动以通过接口与片段通信

Java Can';t获取活动以通过接口与片段通信,java,android,android-fragments,interface,android-viewpager,Java,Android,Android Fragments,Interface,Android Viewpager,我试图让我的活动在我的viewpager检测到任何滑动时调用我的片段 这是我的活动代码 public interface SwipeListener { void swipe(); } private SwipeListener mSwipeListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCon

我试图让我的活动在我的viewpager检测到任何滑动时调用我的片段

这是我的活动代码

public interface SwipeListener {
    void swipe();
}

private SwipeListener mSwipeListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_catalog);
    ButterKnife.bind(this);
    setSupportActionBar(mToolbar);

    int startingFragmentPosition = 0;

    mSwipeListener = (SwipeListener) this;

    ClothingSectionsPagerAdapter sectionsPagerAdapter =
            new ClothingSectionsPagerAdapter(getSupportFragmentManager());
    sectionsPagerAdapter.setContext(this);
    mViewPager.setAdapter(sectionsPagerAdapter);
    mTabLayout.setupWithViewPager(mViewPager);
    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
    mTabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
    mViewPager.setCurrentItem(startingFragmentPosition);

    mViewPager.setOnDragListener(new View.OnDragListener() {
        @Override
        public boolean onDrag(View view, DragEvent dragEvent) {
            mSwipeListener.swipe();
            return false;
        }
    });
}

在我的片段中,我实现了这个接口并重写了这个方法。但是当我运行应用程序时。它崩溃了,说它无法在
onCreate
方法中将
this
强制转换为
SwipeListener
。如何修复此问题?

这是因为您试图将活动设置为
SwipeListener
。 您的片段应该实现这个接口,然后将这个片段作为
SwipeListener


我认为最好将片段列表(在活动中创建片段)传递给您的
ClothingSectionsPageAdapter
,这样您就可以有一个参考,或者可以使用创建片段列表的相同方法创建
SwipeListener

这不是它的工作方式。您必须注册对发布者组件的回调(在您的活动中)。 如果要将滑动操作传递给碎片表单活动。您应该在Fragment中实现
SwipeListener
,并将其设置为Activity。下面是一个例子

public class MainActivity extends AppCompatActivity {
private List<SwipeListener> listeners = new ArrayList<>();
public void addSwipeListener(SwipeListener listener) {
    listeners.add(listener);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new);
    mViewPager.setOnDragListener(new View.OnDragListener() {
        @Override
        public boolean onDrag(View view, DragEvent dragEvent) {
            for (SwipeListener listener : listeners) {
                listener.swipe();
            }
            return false;
        }
    });
}

我已经制作了一个回调列表,以便您可以管理多个片段,并根据需要修改它。别忘了在Fragment的Detach上删除侦听器

你能描述一下你想要实现的目标吗?你想给fragment发送滑动动作吗?我想让fragment尽早开始加载数据。因为当前存在刷卡事件时,片段不会自动加载数据。您可以从“活动”调用加载方法,然后通过获取已注册的片段直接将其传递给片段:。这个的侦听器实现是错误的。您的实现是错误的。在这里,您只需将片段上下文类型转换为SwipeListener。您需要在activity中实现接口并从中设置接口。在
onCreateView()
中,
getActivity()
调用不能是
null
。我认为它应该在
onActivityCreated()
中。
class FragmentA extends Fragment implements SwipeListener{
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
 ((MainActivity)getActivity()).addSwipeListener(this);
    super.onActivityCreated(savedInstanceState);
 }

    @Override
    public void swipe() {
        // here you will get callback
    }
}