Я хотів би додати для початківців, що різницю між двома найбільш сприятливими відповідями тут дає різне використання фрагмента.
Якщо ви використовуєте фрагмент у класі java, у якому є дані, які ви хочете передати, ви можете застосувати першу відповідь для передачі даних:
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
Якщо ви використовуєте, наприклад, код за замовчуванням, наданий Android Studio для фрагментів з вкладками, цей код не працюватиме.
Він не буде працювати, навіть якщо ви заміните замовчувачFragment за замовчуванням своїм FragmentClasses, і навіть якщо ви виправите FragmentPagerAdapter у новій ситуації, додавши перемикач для getItem () та інший перемикач для getPageTitle () (як показано тут )
Попередження: у вищезазначеному кліпі є помилки в коді, які я поясню пізніше тут, але корисно побачити, як ви переходите від коду за замовчуванням до редагованого коду для фрагментів з вкладками)! Решта моєї відповіді має набагато більше сенсу, якщо ви враховуєте класи java та файли xml із цього кліпу (представницького для першого використання фрагментів з вкладками за початковим сценарієм).
Основна причина, за якою не працює найбільш відповідна відповідь на цій сторінці, - це те, що в цьому коді за замовчуванням для фрагментів на вкладках фрагменти використовуються в іншому класі Java: FragmentPagerAdapter!
Отже, для того, щоб надіслати дані, ви спокушаєтесь створити пакет у програмі MotherActivity і передати їх у FragmentPagerAdapter, використовуючи відповідь №2.
Тільки знову це неправильно. ( Можливо, ви могли це зробити так, але це просто ускладнення, яке насправді не потрібно ).
Правильний / простіший спосіб зробити це, я думаю, передавати дані безпосередньо у відповідний фрагмент, використовуючи відповідь №2. Так, між діяльністю та фрагментом, АЛЕ, буде встановлено тісний зв'язок для фрагментів з вкладками, що очікується. Я б навіть радив вам створити фрагменти з вкладками всередині ява класу MotherActivity (як підкласи, оскільки вони ніколи не будуть використовуватися за межами MotherActivity) - це просто, просто додайте всередину класу java MotherActivity стільки фрагментів, скільки вам потрібно:
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;
}
}.
Отже, для передачі даних від MotherActivity до такого фрагмента вам потрібно буде створити приватні рядки / розшарування над onCreate вашої діяльності "Mother" - які ви можете заповнити даними, які ви хочете передати фрагментам, і передати їх через метод, створений після onCreate (тут називається 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;
}
}
А потім у класі фрагментів ви використовуєте 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;
}
}
Якщо у вас є запити до бази даних, я раджу вам виконувати їх у програмі MotherActivity (і передавати їх результати у вигляді рядків / цілих чисел, прикріплених до ключів всередині пакета, як показано вище), як і всередині фрагментів з вкладками, ваш синтаксис стане складнішим (це стає getActivity (), наприклад, і getIntent стає getActivity (). getIntent), але ви також можете зробити так, як хочете.
Моя порада для початківців - зосередитись на маленьких кроках. По-перше, попросіть відкрити дуже просту діяльність на вкладках, не передаючи жодних даних. Це працює? Це відкриває вкладки, які ви очікуєте? Якщо ні, то чому?
Почніть з цього, і застосувавши такі рішення, як представлені в цьому кліпі , подивіться, чого немає. Для цього конкретного кліпу mainactivity.xml ніколи не відображається. Це, безумовно, збентежить вас. Але якщо ви звернете увагу, ви побачите, що, наприклад, контекст (інструменти: контекст) неправильний у файлах фрагментів xml. Кожен фрагмент XML повинен вказувати на правильний клас фрагмента (або підклас, використовуючи роздільник $).
Ви також побачите, що до основного класу активності Java потрібно додати tabLayout.setupWithViewPager (mViewPager) - відразу після рядка TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); без цього рядка ваше перегляд насправді не пов'язане з XML-файлами фрагментів, але воно відображає ТІЛЬКИ XML-файл основного виду діяльності.
На додаток до рядка класу java основної діяльності, у XML-файлі основної діяльності потрібно змінити вкладки відповідно до вашої ситуації (наприклад, додати або видалити TabItems). Якщо у вас немає вкладок в основній діяльності XML, можливо, ви не вибрали правильний тип діяльності, коли ви створили його в першу чергу (нова активність - активність на вкладках).
Зверніть увагу, що в останніх 3 абзацах я розповідаю про відео! Отже, коли я кажу про основну діяльність XML, це основна діяльність XML у відео, яка у вашій ситуації є файлом XML MotherActivity.