it-swarm.com.ru

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

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

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

9
navid abutorab

Создайте одну interface в своей Activity и передайте свои данные через interfacefragment. Реализуйте это 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.

14
pooja

Объект 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
  }

}
3
Pavneet_Singh

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

public interface FragmentCommunicator {

void updateDataToFragment(List<Parcelable> data);

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

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

        }`

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

1
Balflear

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

Подробнее об этом

1
tpk

На самом деле ваш вопрос не связан с: 

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

Настоящий таков:

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

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

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

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

В деятельности:

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

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

1
matheszabi

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

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

fragmentInstance.publicMethod(newData);

Удачного кодирования!

0
Na Pro

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

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