【问题标题】:Can't get activity to communicate with fragment through interface无法通过接口获取活动以与片段通信
【发布时间】:2017-12-29 08:46:10
【问题描述】:

当我的 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。我该如何解决这个问题?

【问题讨论】:

  • 您能描述一下您想要实现的目标吗?您想将滑动操作发送到片段吗?
  • 我希望片段尽早开始加载数据。因为目前当有滑动事件时,fragment不会自动加载数据。
  • 你可以从activity中调用load方法,然后通过获取注册的fragment:stackoverflow.com/questions/8785221/…直接传递给fragment。 AFAIK 的监听器实现是错误的。
  • 你的实现是错误的。在这里,您只需在 SwipeListener 中键入转换片段上下文。您需要在活动中实现接口并从那里设置接口。

标签: java android android-fragments interface android-viewpager


【解决方案1】:

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

我认为最好将片段列表(在您的活动中创建它们)传递给您的ClothingSectionsPageAdapter,以便您可以参考,或者以您创建片段列表的相同方法创建您的SwipeListener

【讨论】:

    【解决方案2】:

    这不是它的工作方式。您必须向发布者组件注册回调(在您的情况下为活动)。 如果您想将滑动操作传递给片段表单 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 上移除监听器。

    【讨论】:

    • getActivity() 调用不能是onCreateView() 中的null。我认为应该在onActivityCreated()
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多