web-dev-qa-db-fra.com

Android - Comment passer des données d'activité à fragmenter?

J'ai besoin de transmettre des données d'activité à fragmenter. Je sais que je peux utiliser bundle, mais une fois que j'ai transmis des données, je ne peux pas envoyer de données sans appeler et créer de nouveau fragment. 

Dans mon activité, quelque chose peut être changé et je dois notifier ces modifications à mon fragment sans recréer fragment. 

9
navid abutorab

Créez une interface dans votre Activity et transmettez vos données via la interface à la fragment. Implémentez cette interface dans votre fragment pour obtenir des données. 

Par exemple

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>

Dans l'exemple ci-dessus, j'ai pris Runnable juste pour envoyer des données avec un délai de 5 secondes après la création de fragment.

14
pooja

L'objet fragmentaire est comme les autres objets. Comme String, vous pouvez invoquer des méthodes d'objet string, str.charAt (0), str.toUpperCase (), etc. Créez simplement une fonction dans un fragment, placez-y votre code et appelez la fonction valeurs

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

Pour notifier le fragment contenant certaines données après sa création, vous pouvez utiliser un Communicator ou vous pouvez toujours transmettre les données avec bundle lors de la création ...

public interface FragmentCommunicator {

void updateDataToFragment(List<Parcelable> data);

} puis dans votre fragment, implémentez cette interface et appelez-la depuis l'activité, par exemple: `

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

        }`

Cela devrait fonctionner pour votre cas ...

1
Balflear

L'activité hôte peut transmettre des messages à un fragment en capturant le fichier Fragment instance avec findFragmentById (), puis appelez directement le fichier méthodes publiques de fragment.

Dans votre fragment - MyFragment, créez une méthode publique

public void myFragmentDataFromActivity(int passedDataFromActivity) {

// do your stuff

}

Pour que votre activité passe une valeur entière, par exemple, 100:

obtenez l'instance MyFragment à l'aide de getSupportFragmentManager ou getFragmentManager en fournissant l'id/tag/position. Puis appelez la méthode publique dans l'instance MyFragment.

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

myFragment.myFragmentDataFromActivity(100);

Vous pouvez également utiliser getFragmentByTag(tag), getFragments().get(position) au lieu de getFragmentById(id) pour obtenir une instance de fragment.

en savoir plus à ce sujet

1
tpk

En fait, votre question ne concerne pas: 

J'ai besoin de transmettre des données d'activité à fragmenet. Je sais que je peux utiliser bundle, mais celui que j'ai transmis des données, je ne peux plus envoyer de données sans appeler et créer un fragment une fois de plus.

Le vrai est celui-ci:

dans mon activité, quelque chose peut être changé et je dois avertir mon fragmenter à partir de ces changements sans recréer fragment.

comment puis-je le faire?

Dans ce cas, je stockerais le fragment de l'activité en tant que référence et j'appellerais une fonction, une implémentation d'interface à l'intérieur du fragment.

Quelque chose comme ça:

En activité:

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

L'interface vous aidera uniquement à tester.

1
matheszabi

essayez celui-ci dans l'activité

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

et en fragment

     Pdf = getArguments().getString("pdf");
0
Mr. Mad

Vous devez déclarer votre méthode publique dans le fragment pour mettre à jour de nouvelles données. Ensuite, vous appellerez cette méthode via une instance de fragment. Par exemple, écrivez ceci dans votre activité lorsque vous obtenez de nouvelles données:

fragmentInstance.publicMethod(newData);

Bonne codage!

0
Na Pro

J'ai aussi rencontré le même problème, j'ai utilisé singleton class pour transférer des données d'une activité à une autre (sans créer fragment transaction ou en utilisant une interface)

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() {
    }
}

définir et obtenir des données

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