2016-06-07 177 views
1

有一個tabLayout和ViewPager。 所以我想將數據從fragment1傳遞給fragment2。如何在viewpager中的片段之間傳遞數據?

注意:fragment1 vs fragment2位於VIewPager中。所以我無法按照正常的方式傳遞數據。

FragmentTransaction fragmentTx=this.FragmentManager.BeginTransaction(); 
      TracksByGenres fragTrack=new TracksByGenres(); 
      fragTrack.AddData(items[e.Position]); 
      //get our item from listview 

      fragmentTx.Replace(Resource.Id.fragmentContainer,fragTrack);  
      fragmentTx.AddToBackStack(null); 
      fragmentTx.Commit(); 
+0

檢索來自稱爲片段的onCreate()中的數據可以使用基於事件的解決方案,我曾在一個viewpager 2個片段和成功傳遞數據。去搜索EventBus。如果你想我可以給你工作的例子。 –

回答

3

使用sharedPreferences

SharedPreferences sharedpreferences; 
public static final String MyPREFERENCES = "MyPrefs" ; 
sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); 

保存價值

SharedPreferences.Editor editor = sharedpreferences.edit(); 
editor.putString("TAG_NAME", "value"); 
editor.commit(); 

檢索偏好數據:在第二個片段

public static final String MyPREFERENCES = "MyPrefs" ; 
SharedPreferences prefs = getSharedPreferences(MyPREFERENCES , MODE_PRIVATE); 
String restoredText = prefs.getString("TAG_NAME", null); 
1

你可以使用一個接口。

public interface DataBoy{ 
    public void bigDog(Data data); 
} 

內部片段1:

DataBoy dataBoy = (DataBoy)getActivity().getSupportFragmentManager().findFragmentById(R.id.fragment2); 

dataBoy.bigDog(data); 

內部片段2:

fragment2 implements DataBoy { 
... 

@Override 
public void bigDog(Data data); 
doSomethingWith(data); 
} 
0

取決於數據的性質。

理想情況下,數據在ActivityViewPager Adapter舉行 - 所以當每個片構建它會從活動等。其數據請參見本question on SO

在我看來,最好的解決辦法是,如果你可以存儲數據庫中的數據,每個Fragment通過CotnentProvider將數據存儲在數據庫中,然後您可以使用Loaders特別是CursorLoader檢索數據 - 此方法將始終爲您提供最新數據,因爲Laoder將在其更改時得到通知。

看看官方文檔這裏的example

推薦使用偏好上述建議存儲比原語等的設置等複雜的數據。

+0

代碼示例?... –

+0

該鏈接不起作用 –

+0

@SteveC。已更新 – Zain

0

嘗試片段之間的下面的代碼通數據

Bundle bundle = new Bundle(); 
FragmentTransaction fragmentTx=this.FragmentManager.BeginTransaction(); 
TracksByGenres fragTrack=new TracksByGenres(); 
bundle.putString(key, value); i.e bundle.putString("myKey",items[e.Position]); 
fragTrack.setArguments(bundle); 
       //get our item from listview 
fragmentTx.Replace(Resource.Id.fragmentContainer,fragTrack);  
fragmentTx.AddToBackStack(null); 
fragmentTx.Commit(); 

通過

Bundle bundle = this.getArguments(); 
String value= bundle.putString(key, defaultValue); i.e bundle.putString(myKey, ""); 
相關問題