2015-06-17 50 views
1

嘿StackOverFlow社区!我真的需要帮助.. :(如何使用ViewPager将数据从Activity传递到Tab碎片?

我在寻找2到3个小时,现在并没有发现任何相关的和简单

我解释的背景: 我有一个活动A1。此活动包含3个片段F1,F2,F3,它使用ViewPager,因此通过选择标签或通过滑动屏幕实际选择3个片段,并且这可以工作

我现在想做的事: 出于某些原因,我为活动中的数据调用Web服务。数据取决于t他意图让活动A1从最初的调用活动A0(它是一个group_id)获得。所以,我想将我从A1服务获得的这些数据从Web服务发送到我的每个片段F1,F2和F3。

你有解决方案或解释如何在ViewPager中传递数据片段?

非常感谢!

有我的活动的基础码A1:

public class ShowGroupActivity extends FragmentActivity implements 
     ActionBar.TabListener { 

private ViewPager viewPager; 
    private TabsPagerAdapter mAdapter; 
    private ActionBar actionBar; 
    // Tab titles 
    private String[] tabs = { "Infos", "Parcours", "Mur" }; 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_ACTION_BAR); 
     setContentView(R.layout.activity_show_group); 

     // Initilization 
     viewPager = (ViewPager) findViewById(R.id.pager); 
     actionBar = getActionBar(); 
     mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

     viewPager.setAdapter(mAdapter); 
     actionBar.setHomeButtonEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Adding Tabs 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name) 
        .setTabListener(this)); 
     } 

     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int position) { 
       // on changing the page 
       // make respected tab selected 
       actionBar.setSelectedNavigationItem(position); 
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
      } 
     }); 

@Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     // on tab selected 
     // show respected fragment view 
     viewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    } 

这里是一个片段的一个例子:F1(在其欲显示由A1中给出了一些数据) 。

public class GroupInfoFragment extends Fragment { 

public GroupInfoFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View v = inflater.inflate(R.layout.fragment_group_info, container, false); 

     return v; 

    } 


} 

回答

1

做到这一点,最简单和最快的方式是使用EventBus。 只需事件在您的onResponse方法在活动和片段将处理其余。

活动 -

  • 创建NetworkResponceEvent
  • OnResponse称为:发布一个新NetworkResponceEvent到eventbus。

片段 -

  • 注册纪录的onResume
  • UnRegister- osPause
  • 创建方法的onEvent(NetworkResponceEvent E) - 处理所有 更新这里。
+0

但是这里存在问题! 在不可见的片段中调用该事件(选定选项卡),因此其他片段不会收到数据 –

+0

如果片段是不同的选项卡,则会调用该选项卡。当你切换标签时,片段的onpause没有被调用。 – EE66

1

您应该从碎片中使用getActivity()方法。

我会建议宣布你的片段内部的接口,如:

public class GroupInfoFragment extends Fragment { 
... 
public interface Callbacks { 
    // you should declare methods for returning the data you want form your activity here 
    Foo getData(); 
} 
... 
} 

然后实现这个接口在ShowGroupActivity类,像这样:

public class ShowGroupActivity extends FragmentActivity implements 
    ActionBar.TabListener, GroupInfoFragment.Callbacks { 
... 
    @Override 
    Foo getData() { 
     return mData; 
    } 
... 
} 

那么你就能够通过以下方式从您的片段类中获取数据:

GroupInfoFragment.Callbacks callbacks = (GroupInfoFragment.Callbacks) getActivity(); 
Foo data = callbacks.getData; 

通过这样做,你可以实现你的片段类而不用担心活动的实现。


其他注意事项

您还可以覆盖你的片段的onAttach()方法,这样你可以随时保证你的片段被连接到实现Callback接口的活动。您还可以保留对Callback实例的引用:

Callbacks mCallbacks; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    if (!(activity instanceof Callbacks)) { 
     throw new ClassCastException("Activity must implement fragment's callbacks."); 
    } 

    mCallbacks = (Callbacks) activity; 
} 
相关问题