从子片段更改 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();
希望对您有所帮助!
我有一个 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();
希望对您有所帮助!