Je voudrais ajouter pour les débutants que la différence entre les 2 réponses les plus votées ici est donnée par l'utilisation différente d'un fragment.
Si vous utilisez le fragment dans la classe java où vous avez les données que vous souhaitez transmettre, vous pouvez appliquer la première réponse pour transmettre les données:
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
Si toutefois vous utilisez par exemple le code par défaut donné par Android Studio pour les fragments à onglets, ce code ne fonctionnera pas.
Cela ne fonctionnera pas même si vous remplacez le PlaceholderFragment par défaut par vos FragmentClasses, et même si vous corrigez FragmentPagerAdapter à la nouvelle situation en ajoutant un commutateur pour getItem () et un autre commutateur pour getPageTitle () (comme illustré ici )
Attention: le clip mentionné ci-dessus contient des erreurs de code, que j'expliquerai plus loin ici, mais est utile pour voir comment vous passez du code par défaut au code modifiable pour les fragments à onglets)! Le reste de ma réponse est beaucoup plus logique si vous considérez les classes java et les fichiers xml de ce clip (représentatif d'une première utilisation de fragments tabulés par un scénario débutant).
La principale raison pour laquelle la réponse la plus positive de cette page ne fonctionnera pas est que dans ce code par défaut pour les fragments à onglets, les fragments sont utilisés dans une autre classe java: FragmentPagerAdapter!
Donc, pour envoyer les données, vous êtes tenté de créer un bundle dans MotherActivity et de le passer dans FragmentPagerAdapter, en utilisant la réponse n ° 2.
Seulement, c'est encore mal. ( Vous pourriez probablement le faire comme ça, mais ce n'est qu'une complication qui n'est pas vraiment nécessaire ).
La manière correcte / plus facile de le faire, je pense, est de passer les données directement au fragment en question, en utilisant la réponse n ° 2. Oui, il y aura un couplage étroit entre l'activité et le fragment, MAIS, pour les fragments à onglets, ce qui est en quelque sorte attendu. Je vous conseillerais même de créer les fragments tabulés à l'intérieur de la classe java MotherActivity (en tant que sous-classes, car ils ne seront jamais utilisés en dehors de MotherActivity) - c'est facile, ajoutez simplement à l'intérieur de la classe java MotherActivity autant de fragments que vous le souhaitez, comme ceci:
public static class Tab1 extends Fragment {
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
return rootView;
}
}.
Donc, pour transmettre des données de la MotherActivity à un tel fragment, vous devrez créer des chaînes / bundles privés au-dessus de l'activité onCreate de votre mère - que vous pouvez remplir avec les données que vous souhaitez transmettre aux fragments et les transmettre via un méthode créée après le onCreate (ici appelé getMyData ()).
public class MotherActivity extends Activity {
private String out;
private Bundle results;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mother_activity);
// for example get a value from the previous activity
Intent intent = getIntent();
out = intent.getExtras().getString("Key");
}
public Bundle getMyData() {
Bundle hm = new Bundle();
hm.putString("val1",out);
return hm;
}
}
Et puis dans la classe fragment, vous utilisez getMyData:
public static class Tab1 extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);
MotherActivity activity = (MotherActivity)getActivity();
Bundle results = activity.getMyData();
String value1 = results.getString("val1");
output.setText(value1);
return rootView;
}
}
Si vous avez des requêtes de base de données, je vous conseille de les faire dans MotherActivity (et de passer leurs résultats sous forme de chaînes / entiers attachés aux clés dans un bundle comme indiqué ci-dessus), comme dans les fragments tabulés, votre syntaxe deviendra plus complexe (cela devient getActivity () par exemple, et getIntent devient getActivity (). getIntent), mais vous avez également la possibilité de faire ce que vous voulez.
Mon conseil pour les débutants est de se concentrer sur de petites étapes. Tout d'abord, obtenez votre intention d'ouvrir une activité à onglets très simple, sans transmettre de données. Est-ce que ça marche? Ouvre-t-il les onglets que vous attendez? Sinon, pourquoi?
Commencez par cela, et en appliquant des solutions telles que celles présentées dans ce clip , voyez ce qui manque. Pour ce clip particulier, le fichier mainactivity.xml n'est jamais affiché. Cela vous troublera sûrement. Mais si vous faites attention, vous verrez que par exemple le contexte (tools: context) est incorrect dans les fichiers de fragments xml. Chaque fragment XML doit pointer vers la classe de fragment correcte (ou sous-classe à l'aide du séparateur $).
Vous verrez également que dans la classe java d'activité principale, vous devez ajouter tabLayout.setupWithViewPager (mViewPager) - juste après la ligne TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); sans cette ligne, votre vue n'est en fait pas liée aux fichiers XML des fragments, mais elle affiche UNIQUEMENT le fichier xml de l'activité principale.
En plus de la ligne de la classe java d'activité principale, dans le fichier XML d'activité principale, vous devez modifier les onglets en fonction de votre situation (par exemple, ajouter ou supprimer des TabItems). Si vous n'avez pas d'onglets dans le XML d'activité principal, vous n'avez peut-être pas choisi le type d'activité correct lorsque vous l'avez créé en premier lieu (nouvelle activité - activité à onglets).
Veuillez noter que dans les 3 derniers paragraphes je parle de la vidéo! Donc, quand je dis XML d'activité principale, c'est le XML d'activité principale dans la vidéo, qui dans votre situation est le fichier XML MotherActivity.