Vorrei aggiungere per i principianti che la differenza tra le 2 risposte più votate qui è data dal diverso uso di un frammento.
Se usi il frammento all'interno della classe java in cui hai i dati che vuoi passare, puoi applicare la prima risposta per passare i dati:
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
Se tuttavia utilizzi ad esempio il codice predefinito fornito da Android Studio per i frammenti a schede, questo codice non funzionerà.
Non funzionerà anche se si sostituisce PlaceholderFragment predefinito con FragmentClasses e anche se si corregge FragmentPagerAdapter alla nuova situazione aggiungendo un'opzione per getItem () e un'altra opzione per getPageTitle () (come mostrato qui )
Attenzione: la clip sopra menzionata contiene errori di codice, che spiegherò più avanti qui, ma è utile per vedere come si passa dal codice predefinito al codice modificabile per i frammenti a schede)! Il resto della mia risposta ha molto più senso se si considerano le classi Java e i file XML da quella clip (rappresentativi per un primo utilizzo di frammenti a schede da uno scenario per principianti).
Il motivo principale per cui la risposta più votata da questa pagina non funzionerà è che in quel codice predefinito per i frammenti a schede, i frammenti vengono utilizzati in un'altra classe Java: FragmentPagerAdapter!
Quindi, per inviare i dati, sei tentato di creare un pacchetto in MotherActivity e passarlo in FragmentPagerAdapter, usando la risposta n. 2.
Solo quello è di nuovo sbagliato. ( Probabilmente potresti farlo in quel modo, ma è solo una complicazione che non è davvero necessaria ).
Il modo corretto / più semplice per farlo, penso, è di passare i dati direttamente al frammento in questione, usando la risposta n. 2. Sì, ci sarà uno stretto accoppiamento tra l'attività e il frammento, MA, per i frammenti a schede, è un po 'previsto. Ti consiglierei anche di creare i frammenti a schede all'interno della classe java MotherActivity (come sottoclassi, in quanto non verranno mai utilizzati al di fuori di MotherActivity) - è facile, basta aggiungere all'interno della classe java MotherActivity tutti i frammenti di cui hai bisogno in questo modo:
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;
}
}.
Quindi, per trasferire i dati da MotherActivity a un tale frammento, dovrai creare stringhe / bundle privati sopra l'onCreate della tua attività madre - che puoi riempire con i dati che vuoi passare ai frammenti e trasmetterli tramite un metodo creato dopo onCreate (qui chiamato 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;
}
}
E poi nella classe dei frammenti, usi 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;
}
}
Se hai domande sul database ti consiglio di eseguirle in MotherActivity (e passare i loro risultati come stringhe / numeri interi collegati alle chiavi all'interno di un bundle come mostrato sopra), come all'interno dei frammenti a schede, la tua sintassi diventerà più complessa (questo diventa getActivity () ad esempio, e getIntent diventa getActivity (). getIntent), ma hai anche la possibilità di fare ciò che desideri.
Il mio consiglio per i principianti è di concentrarsi su piccoli passi. Innanzitutto, cerca di aprire un'attività a schede molto semplice, senza passare QUALSIASI dato. Funziona? Apre le schede che ti aspetti? Se no, perché?
Inizia da quello e applicando soluzioni come quelle presentate in questa clip , vedi cosa manca. Per quel particolare clip, mainactivity.xml non viene mai mostrato. Questo sicuramente ti confonderà. Ma se presti attenzione, vedrai che ad esempio il contesto (strumenti: contesto) è errato nei file di frammenti XML. Ogni frammento XML deve puntare alla classe di frammento corretta (o sottoclasse usando il separatore $).
Vedrai anche che nella principale attività java class devi aggiungere tabLayout.setupWithViewPager (mViewPager) - subito dopo la riga TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); senza questa linea, la tua vista non è in realtà collegata ai file XML dei frammenti, ma mostra SOLO il file xml dell'attività principale.
Oltre alla riga nella classe java dell'attività principale, nel file XML dell'attività principale è necessario modificare le schede per adattarle alla propria situazione (ad esempio aggiungere o rimuovere TabItems). Se non hai schede nell'XML dell'attività principale, probabilmente non hai scelto il tipo di attività corretto quando lo hai creato in primo luogo (nuova attività - attività a schede).
Si noti che negli ultimi 3 paragrafi parlo del video! Quindi, quando dico XML dell'attività principale, è il XML dell'attività principale nel video, che nella tua situazione è il file XML di MotherActivity.