Android的 – 如何将数据从活动传递给片段?

我需要将数据从活动传递到片段。 我知道我可以使用捆绑,但是一旦我传递了数据,我不能发送数据,而无需再次调用和创build片段。

在我的活动中,有些事情可能会改变,我需要通知我的片段这些更改,而不重新创build片段。

Solutions Collecting From Web of "Android的 – 如何将数据从活动传递给片段?"

在您的Activity创build一个interface ,并通过interface将您的数据传递给fragment 。 在fragment实现该interface以获取数据。

例如

MainActivity.class

 public class MainActivity extends AppCompatActivity { DataFromActivityToFragment dataFromActivityToFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentA fr = new FragmentA(); FragmentManager fm = getFragmentManager(); dataFromActivityToFragment = (DataFromActivityToFragment) fr; FragmentTransaction fragmentTransaction = fm.beginTransaction(); fragmentTransaction.replace(R.id.fragment_place, fr); fragmentTransaction.commit(); final Handler handler = new Handler(); final Runnable r = new Runnable() { public void run() { dataFromActivityToFragment.sendData("Hi"); } }; handler.postDelayed(r, 5000); } public interface DataFromActivityToFragment { void sendData(String data); } } 

FragmentA.class

 public class FragmentA extends Fragment implements MainActivity.DataFromActivityToFragment { TextView text; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.content_main, null); text = (TextView) rootView.findViewById(R.id.fragment_text); return rootView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void sendData(String data) { if(data != null) text.setText(data); } } 

activity_main.xml中

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/fragment_place" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> </LinearLayout> </LinearLayout> 

content_main.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/fragment_text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

在上面的例子中,我已经采取了Runnable只是为了在创buildfragment后延迟5秒发送数据。

片段对象就像其他objects.Likestring,你可以调用string对象,str.charAt(0),str.toUpperCase()等方法。只要在片段中创build一个函数,把你的代码,调用函数值

 Inside Activity { fragDemoObject.doWhatYouWant("this is passed as string object to fragment"); } Inside FragmentDemo{ void doWhatYouWant(String input){ System.out.println(input); // do what else you want to do with code } } 

其实你的问题是不相关的:

我需要将活动的数据传递给fragmenet。我知道我可以使用bundle,但是我已经传递了数据,我不能再次发送数据而无需调用和创build片段。

真正的是这样的:

在我的活动中,有些东西可能会改变,我需要从这些改变中通知我的片段,而不重新创build片段。

我该怎么办?

在这种情况下,我将片段存储在活动作为参考,我会调用一个函数,在片段内的接口实现。

像这样的东西:

在活动中:

 SomeEventListener myFragment ; yourFragmentCreationMethod(){ if(myFragment == null){ myFragment = new MyFragment(maybeParamsHere); } } yourNotificationMethod(){ myFragment .onEventHappent(param); } // declare an interface: - separate file public interface SomeEventListener { void onEventHappent(param); } // implement the interface in Fragment - separate file public class MyFragment extends Fragment implements SomeEventListener{ // add a constructor what you like public void onEventHappent(param){ /// ... your update } } 

界面它只会帮助你进行testing。

主机活动可以通过使用findFragmentById()来捕获Fragment实例,然后直接调用片段的公共方法来将消息传递到片段。

在你的片段 – MyFragment ,创build一个公共方法

 public void myFragmentDataFromActivity(int passedDataFromActivity) { // do your stuff } 

在你的活动中传递一个整数值,比如说100:

使用getSupportFragmentManager或getFragmentManager通过提供id / tag / position来获取MyFragment实例。 然后调用MyFragment实例中的公共方法。

 MyFragment myFragment = (MyFragment) getSupportFragmentManager.getFragmentById(id); myFragment.myFragmentDataFromActivity(100); 

您也可以使用getFragmentByTag(tag)getFragments().get(position)而不是getFragmentById(id)来获取片段实例。

阅读更多关于这个

在Activity中试试这个

 fragment=new PdfFragment(); if (fragment != null) { FragmentManager fragmentManager = getFragmentManager(); Bundle bundle = new Bundle(); bundle.putString("pdf", Pdf); bundle.putString("flag", "0"); fragment.setArguments(bundle); fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack(null).commit(); } 

并在片段

  Pdf = getArguments().getString("pdf"); 

你应该声明你的方法在片段中是公开的,以更新新的数据。 然后你将通过片段实例调用该方法。 例如,在获取新数据时将其写入您的活动中:

 fragmentInstance.publicMethod(newData); 

快乐的编码!

对于创build后的某些数据通知片段,可以使用某个Communicator完成,也可以始终在创build时使用包传递数据…例如:

 public interface FragmentCommunicator { void updateDataToFragment(List<Parcelable> data); 

}然后在你的片段中实现这个接口,并从activity中调用它,例如:`

 Fragment fragment = mSectionsPagerAdapter.getRegisteredFragment(i); if (fragment instanceof FragmentCommunicator) { FragmentCommunicator fragmentCommunicator = (FragmentCommunicator) fragment; fragmentCommunicator.updateDataToFragment(data); }` 

这应该适用于你的情况…

我也遇到了同样的问题,我用单例类将数据从活动转移到片段(不进行片段事务或使用接口)

 class DataPersistance { public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPlace() { return place; } public void setPlace(String place) { this.place = place; } public String getType() { return type; } public void setType(String type) { this.type = type; } private String name; private String place; private String type; private static final DataPersistance ourInstance = new DataPersistance(); static DataPersistance getInstance() { return ourInstance; } private DataPersistance() { } } 

设置和获取数据

  DataPersistance.getInstance().setName(mEditText.getText().toString()); String name = DataPersistance.getInstance().getName();