如何使用ViewPager将数据从Activity传递到Tab片段?

时间:2015-06-17 17:42:13

标签: android tabs android-viewpager

Hey StackOverFlow社区!我真的需要帮助...... :(

我现在正在搜索2或3个小时,但没有发现任何相关和简单的内容。

我解释了上下文: 我有一个活动A1。该活性包含3个片段F1,F2,F3。它使用ViewPager,因此通过选择一个选项卡或通过滑动屏幕来选择3个片段,这是有效的。

我现在想做什么: 出于某些原因,我将Web服务称为活动中的数据。数据取决于活动A1从原始调用活动A0获取的意图(它是group_id)。所以,我想把我在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;

    }


}

2 个答案:

答案 0 :(得分:1)

最简单快捷的方法是使用EventBus。 只需在活动中的 onResponse 方法发布事件,片段就可以处理其余事件。

<强>活动 -

  • 创建 NetworkResponceEvent
  • OnResponse调用:将新的 NetworkResponceEvent 发布到eventbus。

<强>片段 -

  • 注册onResume
  • UnRegister- osPause
  • 创建方法onEvent(NetworkResponceEvent e) - 处理所有的 在这里更新。

答案 1 :(得分: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;
}