从子片段更改 ViewPager 片段

Change ViewPager Fragment From Child Fragment

我有一个 ViewPager,它使用带有多个片段的 TabLayout。我想从一个 ViewPager 片段中单击一个按钮,然后使用选项卡名称将用户定向到另一个 tab/fragment。

单击按钮时,我希望 TabLayout 发生变化并显示与该选项卡关联的片段。我还需要发送额外的数据以显示在新片段上的请求。

我无权访问 ViewPager setCurrentItem(int index)。理想情况下,我想与家长沟通以完成请求。

实现此目的的最简单方法,使用 EventBus 框架!

我更喜欢使用 EventBus by greenRobot

实现方式:

1) 创建一个满足您需求的活动class

public class ClickedButtonInsideFragmentEvent {

    // some data you want to store

}

2) 准备好您的订阅者!在您的情况下,这将是 Activity,它包含对选项卡布局的引用:

public class MyTabActivity {

    public void onCreate(Bundle savedInstanceSate) {
        // your stuff you do in onCreate
        eventBus.register(this);
    }

    @Subscribe  
    public void onEvent(ClickedButtonInsideFragmentEvent event) {
        // Do what you want to do
    } 

}

3) 最后:post 来自片段内部的 OnClickListener 的事件:

public class MyClickableFragment {

    public void initOnClickListiner(View clickableView) {
        clickableView.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                ClickedButtonInsideFragmentEvent event = new ClickedButtonInsideFragmentEvent();
                // add what you want to your event
                eventBus.post(event);                
            }
        ));
    }

    @Subscribe  
    public void onEvent(ClickedButtonInsideFragmentEvent event) {
        // Do what you want to do
    } 

}

您应该在 parent(包含 ViewPager 和 sub-fragments)中编写一个方法,如下所示:

public void setPagerFragment(int a)
{
    pager.setCurrentItem(a);
}

这会将 ViewPager 中的当前 Fragment 设置为指定的 Fragment。然后,您可以从 child 片段调用此方法:

int newFrag = 0; //the number of the new Fragment to show
ParentActivity parent = (ParentActivity) getActivity();
parent.setPagerFragment(newFrag);

关于在新片段上显示请求时发送额外数据,您可以在 parent 中创建另一个方法,在 child 中调用,这将在parent,然后 parent 可以在设置新片段时使用它。

例如在parent中:

public void setExtraData(Object data)
{
    dataFromChildFrag = data;
}

然后像这样在 child 中使用它:

String data = "My extra data"; //the number of the new Fragment to show
ParentActivity parent = (ParentActivity) getActivity();
parent.setExtraData(data);

最后,如果 parent 实际上是片段本身而不是 Activity,只需替换所有引用:

ParentActivity parent = (ParentActivity) getActivity();

至:

ParentFragment parent = (ParentFragment) getParentFragment();

希望对您有所帮助!