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

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

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

Ответ 1

Создайте один 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.

Ответ 2

Объект фрагмента похож на другие объекты. Подобно 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
  }

}

Ответ 3

Собственно, ваш вопрос не связан с:

Мне нужно передать данные из активности в 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
    }
}

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

Ответ 4

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

читайте больше об этом

Ответ 5

попробуйте это в 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");

Ответ 6

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

fragmentInstance.publicMethod(newData);

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

Ответ 7

Для уведомления фрагмента с некоторыми данными после его создания можно выполнить с помощью какого-либо Communicator, или вы всегда можете передавать данные с помощью пакета во время создания... Например:

public interface FragmentCommunicator {

void updateDataToFragment(List<Parcelable> data);

} то в вашем фрагменте реализует этот интерфейс и вызывает его из действия, например: `

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

        }`

Это должно работать для вашего случая...

Ответ 8

Я также сталкивался с той же проблемой, я использовал класс singleton для передавать данные из активности в фрагмент (без создания фрагмента транзакция или использование inteface)

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();