我有一个使用带有多个片段的TabLayout的ViewPager。我想从其中一个ViewPager片段中单击一个按钮,并使用选项卡名称将用户定向到另一个选项卡/片段。
单击该按钮时,我希望TabLayout更改以及显示与该选项卡关联的片段。我还需要发送附加数据以显示新片段。
我无法访问ViewPager setCurrentItem(int index)。理想情况下,我想与家长沟通以完成请求。
答案 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
}
}