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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法通过接口获取与片段通信的活动相关的知识,希望对你有一定的参考价值。

当我的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;
        }
    });
}

在我的片段中,我实现了这个接口并覆盖了该方法。但是当我运行应用程序时。它崩溃,说它不能在this方法中将SwipeListener投射到onCreate。我该如何解决?

答案

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

我认为最好将ClothingSectionsPageAdapter传递给片段列表(在你的活动中创建它们),这样你就可以获得一个引用,或者用你创建片段列表的相同方法创建你的SwipeListener

另一答案

这不是它的工作原理。您必须注册回调发布者组件(在您的情况下为活动)。如果要将滑动操作传递给片段表单Activity。您应该在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;
        }
    });
}

}

和示例片段。

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的Detach上的监听器。

以上是关于无法通过接口获取与片段通信的活动的主要内容,如果未能解决你的问题,请参考以下文章

从意图活动访问片段方法

如何使用接口在片段和活动之间进行通信?

如何将数据从一个片段传输到另一个片段android

如何在嵌套片段内的两个子片段之间进行通信

活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常

将接口从片段传递到kotlin中的活动