2016-06-07 179 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, ""); 
相关问题