tablayout+viewpager+fragment实现的下图的效果,怎么在各个Fragment中传递数据并刷新界面?
如图中,点击“菜单”中的按钮,如何在购物车中接收并刷新界面。
阿神2017-04-17 15:02:42
如果Fragment已經存在,試圖透過fragment.setArguments(bundle)
傳遞參數將導致異常:
12-02 00:14:55.375: E/AndroidRuntime(8492): java.lang.IllegalStateException: Fragment already active
12-02 00:14:55.375: E/AndroidRuntime(8492): at android.support.v4.app.Fragment.setArguments(Fragment.java:548)
我更新Fragment的常用方法是,為Fragment定義一個public的方法:
// To update fragment in ViewPager, we should implement a public method for the fragment,
// and do updating stuff in this method.
public void updateDate(Date date) {
mDate = date;
mTextView.setText(mDate.toString());
}
然後取得需要更新的Fragment,然後再呼叫這個方法。
考慮到你只有4個Fragment,可以試著在activity內用一個Array或是List保存這4個fragment的實例(這個法子比較笨)。
而且需要使用FragmentPagerAdapter
,而不是FragmentStatePagerAdapter
,這樣在ViewPager
中切換頁面時,fragment的實例也不會被銷毀。可以參考我的這篇文章 如何更新及替換ViewPager中的Fragment
PHPz2017-04-17 15:02:42
用代理模式實現反向傳值。
activity相當於這些fragment的父集,在activity裡面操作這些fragment肯定是很輕鬆的(因為fragment都是在activity裡new出來的)。所以如果你的一個fragment能拿到activity的話。就可以很輕鬆的操作其它fragment了。
最簡單的方法你可以在fragment中加入一個activity的屬性。在activity中new那些fragment的時候,把activity.this傳給fragment。
不過一般是讓activity實作一個接口,比如說XXDelegate,fragment的建構子都有一個XXDelagate。在activity創作的時候還是傳this(activity自己)過去就可以了。
大家讲道理2017-04-17 15:02:42
可以使用bundle進行參數傳遞,在兩個Fragment跳轉的時候可以帶上參數,在另一個Fragment取得參數的方式只需要使用getArguments().getString("key"); key是自己定義的一個標識,參數的形式只要bundle能傳遞都可以實現 這個原理和Activity基本上是一樣的
例如:
Bundle bundle=new Bundle();
bundle.putString("key", Projsid) ;
fragment.setArguments(bundle); fragment.commit();