从儿童片段更改ViewPager片段

问题描述:

我有一个ViewPager使用TabLayout与几个片段。我想单击其中一个ViewPager片段的按钮,并使用该选项卡名称将用户导向另一个选项卡/片段。从儿童片段更改ViewPager片段

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

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

你应该写一:从你的OnClickListener内幕的片段发布事件

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

这将设置在ViewPager当前片段以指定的一个:方法在父(含有ViewPager和子片段)像这样。然后,您可以调用从子片段此方法:

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(); 

我希望这有助于!

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

我喜欢用EventBus by greenRobot

如何实现(ED):

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

public class ClickedButtonInsideFragmentEvent { 

    // some data you want to store 

} 

2)准备好你的用户!在你的情况,这将是其持有的参考选项卡布局的活动:

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)最后:

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 
    } 

}