从子片段更改ViewPager片段

7
我有一个使用TabLayout的ViewPager,其中包含多个片段。我想从ViewPager中的一个片段中点击一个按钮,并使用选项卡名称将用户指向另一个选项卡/片段。
当单击按钮时,我希望TabLayout更改并显示与该选项卡相关联的片段。我还需要发送附加数据以在新片段上显示。
我无法访问ViewPager setCurrentItem(int index)。理想情况下,我希望与父级通信以完成请求。
2个回答

12

您应该在包含ViewPager和子片段的父级中编写如下方法:

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

这将将ViewPager中的当前Fragment设置为指定的Fragment。然后,您可以从子Fragment中使用以下方式调用此方法:

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

关于在请求中发送额外数据以显示在新片段中,您可以在父类中创建另一个方法,在子类中调用该方法,该方法将在父类中设置一些数据,父类可以在设置新片段时使用这些数据。

例如,在父类中:

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

然后在子元素中这样使用:

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

最后,如果父级实际上是一个 Fragment,而不是一个 Activity,请仅替换所有引用:

ParentActivity parent = (ParentActivity) getActivity();

至:

ParentFragment parent = (ParentFragment) getParentFragment();

希望这能有所帮助!


1
随着Android Jetpack的发布,这现在可以通过共享ViewModels完成:https://developer.android.com/topic/libraries/architecture/viewmodel#sharing关于这是否是良好架构存在不同的观点! - Luke Needham

0

使用EventBus框架是实现这一目标最简单的方法!

我更喜欢使用greenRobot的EventBus

实现步骤:

1)创建一个满足你需求的事件类

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) 最后:在您的Fragment内部的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
    } 

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接