无法获取活动以通过接口与片段通信



当我的查看页检测到任何滑动时,我正在尝试让我的活动调用我的片段。

这是我的活动代码。

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

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

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;
        }
    });
}

}

和示例片段。

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

我列出了一个回调列表,以便您可以管理多个片段,并根据需要对其进行修改。并且不要忘记删除 fragmnent 分离上的侦听器。

最新更新