簡體   English   中英

如何使用ViewPager將數據從活動傳遞到選項卡片段?

[英]How to pass data from an Activity to Tab Fragments using ViewPager?

嘿StackOverFlow社區! 我真的需要幫助.. :(

我現在搜索了2到3個小時,卻沒有找到任何相關且簡單的內容。

我解釋上下文:我有一個活動A1。 該活動包含3個片段F1,F2,F3。 它使用ViewPager,因此實際上是通過選擇選項卡或通過輕掃屏幕來選擇這3個片段,這是可行的。

我現在想做的事情:出於某些原因,我將Web服務稱為活動中的數據。 數據取決於活動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; } } 

最簡單,最快的方法是使用EventBus 只需在活動中的onResponse方法上發布一個事件,該片段將處理其余的事件。

活動-

  • 創建一個NetworkResponceEvent
  • OnResponse稱為:將新的NetworkResponceEvent發布到事件總線。

片段 -

  • 注冊簡歷
  • 取消注冊暫停
  • 創建方法onEvent(NetworkResponceEvent e)-在此處理所有更新。

您應該從片段中使用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM