Android – Как передавать данные из активности в фрагмент?

Мне нужно передать данные из активности в фрагмент. Я знаю, что могу использовать пакет, но как только я передал данные, я не могу отправлять данные без вызова и создания фрагмента.

В моей деятельности некоторые вещи могут быть изменены, и мне нужно уведомить об этом свой фрагмент без повторного создания фрагмента.

Solutions Collecting From Web of "Android – Как передавать данные из активности в фрагмент?"

Создайте один interface в своей Activity и передайте свои данные через interface к fragment . Внедрите этот interface в свой fragment чтобы получить данные.

Например

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 только для отправки данных с задержкой в ​​5 секунд после создания fragment .

Объект фрагмента похож на другие объекты. Подобно String, вы можете вызывать методы строкового объекта, str.charAt (0), str.toUpperCase () и т. Д. Просто создайте функцию в фрагменте, поместите там свой код и вызовите функцию вместе с значения

 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. Я знаю, что могу использовать пакет, но один из них передал данные, я не могу больше отправлять данные без вызова и создания фрагмента еще раз.

Реальный – это:

В моей деятельности некоторые вещи могут быть изменены, и мне нужно уведомить мой фрагмент из этих изменений без повторного создания фрагмента.

Как я могу это сделать?

В этом случае я бы сохранил фрагмент в активности в качестве ссылки, и я бы назвал функцию, реализацию интерфейса внутри фрагмента.

Что-то вроде этого:

В работе:

 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 } } 

Интерфейс это поможет вам только на тестировании.

Активность хоста может доставлять сообщения фрагменту, захватывая экземпляр фрагмента с помощью findFragmentById (), а затем напрямую вызывает общедоступные методы фрагмента.

В вашем фрагменте – MyFragment , создайте общедоступный метод

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

В вашей деятельности, чтобы передать целочисленное значение, скажем, 100:

Получить экземпляр MyFragment, используя getSupportFragmentManager или getFragmentManager, предоставив id / tag / position. Затем вызовите общедоступный метод в экземпляре 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); 

Счастливое кодирование!