从子片段

时间:2016-09-14 22:10:06

标签: android android-fragments android-viewpager android-tablayout

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

单击该按钮时,我希望TabLayout更改以及显示与该选项卡关联的片段。我还需要发送附加数据以显示新片段。

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

2 个答案:

答案 0 :(得分:8)

您应该在父级中编写一个方法(包含ViewPager和子片段),如下所示:

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

这会将ViewPager中的当前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);

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

ParentActivity parent = (ParentActivity) getActivity();

为:

ParentFragment parent = (ParentFragment) getParentFragment();

我希望这有帮助!

答案 1 :(得分:0)

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

我更喜欢(ed)使用EventBus by greenRobot

如何实施:

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

// making this length 7 to avoid off-by-1 indexing issues
// even though they are easy to fix this is conceptually easier
// this just lets index 0 go to waste, its not like we need to save 4 bytes that badly
int[] counters = new int[7];
do
{
   timesRolled++;
   randomRoll = r.nextInt(6) + 1;
   counters[randomRoll]++;
} while (numberOfRolls > timesRolled);
//printing
for(int i = 1; i < counters.length; i++)
{ 
   System.out.printf("Rolled number %d %d times", i, counters[i]);
   //I think my format string is right?  someone fix it if it isn't.
}

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

public class ClickedButtonInsideFragmentEvent {

    // some data you want to store

}

3)最后:从你的OnClickListener内部发布你的片段:

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
    } 

}