Chciałbym dodać dla początkujących, że różnica między 2 najbardziej uprzywilejowanymi odpowiedziami tutaj wynika z różnych zastosowań fragmentu.
Jeśli korzystasz z fragmentu w klasie java, w którym masz dane, które chcesz przekazać, możesz zastosować pierwszą odpowiedź, aby przekazać dane:
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
Jeśli jednak użyjesz na przykład domyślnego kodu podanego przez Android Studio dla fragmentów z kartami, ten kod nie będzie działać.
Nie będzie działać, nawet jeśli zastąpisz domyślny PlaceholderFragment swoimi FragmentClasses, a nawet jeśli poprawisz FragmentPagerAdapter do nowej sytuacji, dodając przełącznik getItem () i inny przełącznik getPageTitle () (jak pokazano tutaj )
Ostrzeżenie: wspomniany wyżej klip zawiera błędy w kodzie, które wyjaśnię poniżej, ale warto zobaczyć, jak przejść od kodu domyślnego do kodu edytowalnego dla fragmentów z zakładkami)! Reszta mojej odpowiedzi ma o wiele większy sens, jeśli weźmiemy pod uwagę klasy Java i pliki XML z tego klipu (reprezentatywne dla pierwszego użycia fragmentów z kartami w scenariuszu dla początkujących).
Głównym powodem, dla którego najbardziej pozytywna odpowiedź z tej strony nie zadziała, jest to, że w tym domyślnym kodzie dla fragmentów z kartami fragmenty są używane w innej klasie Java: FragmentPagerAdapter!
Aby wysłać dane, masz ochotę utworzyć pakiet w MotherActivity i przekazać go w FragmentPagerAdapter, używając odpowiedzi nr 2.
Tyle tylko, że znowu jest źle. ( Prawdopodobnie można to zrobić w ten sposób, ale jest to tylko komplikacja, która tak naprawdę nie jest potrzebna ).
Myślę, że poprawnym / łatwiejszym sposobem jest przekazanie danych bezpośrednio do danego fragmentu przy użyciu odpowiedzi nr 2. Tak, będzie ścisłe powiązanie między Aktywnością a Fragmentem, ALE, dla fragmentów z zakładkami, jest to trochę oczekiwane. Radziłbym nawet utworzyć fragmenty z zakładkami w klasie Java MotherActivity (jako podklasy, ponieważ nigdy nie będą używane poza MotherActivity) - to proste, wystarczy dodać w klasie Java Java MotherActivity tyle fragmentów, ile potrzebujesz:
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;
}
}.
Tak więc, aby przekazać dane z MotherActivity do takiego fragmentu, musisz utworzyć prywatne Strings / Bundle powyżej OnCreate swojej aktywności Mother - które możesz wypełnić danymi, które chcesz przekazać do fragmentów, i przekazać je za pomocą Metoda utworzona po onCreate (tutaj nazywana 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;
}
}
A następnie w klasie fragmentu korzystasz z 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;
}
}
Jeśli masz zapytania do bazy danych, radzę wykonać je w MotherActivity (i przekazać wyniki jako Ciągi / liczby całkowite dołączone do kluczy w pakiecie, jak pokazano powyżej), ponieważ wewnątrz fragmentów z kartami twoja składnia stanie się bardziej złożona (staje się to getActivity () na przykład, a getIntent staje się getActivity (). getIntent), ale masz również opcję robienia tego, co chcesz.
Moja rada dla początkujących polega na skupieniu się na małych krokach. Najpierw zdobądź zamiar otwarcia bardzo prostej czynności na kartach, bez przekazywania ŻADNYCH danych. Czy to działa? Czy otwiera zakładki, których oczekujesz? Jeśli nie to dlaczego?
Zacznij od tego, a stosując rozwiązania, takie jak przedstawione w tym klipie , zobacz, czego brakuje. W przypadku tego konkretnego klipu plik mainactivity.xml nigdy nie jest wyświetlany. To z pewnością cię dezorientuje. Ale jeśli zwrócisz uwagę, zobaczysz, że na przykład kontekst (narzędzia: kontekst) jest niepoprawny w plikach fragmentów xml. Każdy fragment XML musi wskazywać prawidłową klasę fragmentu (lub podklasę za pomocą separatora $).
Zobaczysz również, że w głównej klasie java aktywności musisz dodać tabLayout.setupWithViewPager (mViewPager) - tuż po linii TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); bez tego wiersza widok nie jest faktycznie powiązany z plikami XML fragmentów, ale pokazuje TYLKO plik xml głównej aktywności.
Oprócz wiersza w głównej klasie java działania, w pliku XML głównej czynności musisz zmienić zakładki, aby dopasować je do swojej sytuacji (np. Dodać lub usunąć TabItems). Jeśli nie masz zakładek w głównym pliku XML działania, być może nie wybrałeś poprawnego typu działania, kiedy go utworzyłeś (nowe działanie - działanie z kartami).
Pamiętaj, że w ostatnich 3 akapitach mówię o filmie! Więc kiedy mówię XML głównej aktywności, jest to główny XML aktywności w filmie, którym w twojej sytuacji jest plik XML MotherActivity.