Я хотел бы добавить для начинающих, что разница между двумя наиболее часто задаваемыми ответами здесь заключается в различном использовании фрагмента.
Если вы используете фрагмент в классе java, где у вас есть данные, которые вы хотите передать, вы можете применить первый ответ для передачи данных:
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
Однако, если вы используете, например, код по умолчанию, предоставленный Android Studio для фрагментов с вкладками, этот код не будет работать.
Это не будет работать, даже если вы замените PlaceholderFragment по умолчанию на FragmentClasses, и даже если вы исправите FragmentPagerAdapter в новой ситуации, добавив переключатель для getItem () и другой переключатель для getPageTitle () (как показано здесь) )
Предупреждение: упомянутый выше клип содержит ошибки кода, которые я объясню позже, но полезно посмотреть, как вы переходите от кода по умолчанию к редактируемому коду для фрагментов с вкладками)! Остальная часть моего ответа имеет гораздо больше смысла, если вы рассмотрите java-классы и xml-файлы из этого клипа (представитель для первого использования фрагментов с вкладками в сценарии новичка).
Основная причина, по которой наиболее одобренный ответ на этой странице не сработает, заключается в том, что в этом коде по умолчанию для фрагментов с вкладками фрагменты используются в другом классе Java: FragmentPagerAdapter!
Таким образом, для отправки данных у вас возникает желание создать пакет в MotherActivity и передать его в FragmentPagerAdapter, используя ответ № 2.
Только это снова не так. ( Возможно, вы могли бы сделать это так, но это просто осложнение, которое на самом деле не нужно ).
Я думаю, что правильный / более простой способ сделать это - передать данные непосредственно в рассматриваемый фрагмент, используя ответ № 2. Да, между фрагментами с вкладками будет тесная связь между заданием и фрагментом, но это своего рода ожидание. Я бы даже посоветовал вам создать фрагменты с вкладками внутри Java-класса 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 вашей материнской активности, которые вы можете заполнить данными, которые хотите передать во фрагменты, и передать их через метод, созданный после 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 никогда не отображается. Это, безусловно, смущает вас. Но если вы обратите внимание, вы увидите, что, например, контекст (tools: context) неверен в файлах фрагментов xml. Каждый фрагмент XML должен указывать на правильный класс фрагмента (или подкласс, используя разделитель $).
Вы также увидите, что в основной Java-класс активности вам нужно добавить tabLayout.setupWithViewPager (mViewPager) - сразу после строки TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); без этой строки ваше представление на самом деле не связано с XML-файлами фрагментов, но показывает ТОЛЬКО XML-файл основного действия.
В дополнение к строке в Java-классе основного действия в XML-файле основного действия необходимо изменить вкладки в соответствии с вашей ситуацией (например, добавить или удалить TabItems). Если у вас нет вкладок в основном XML-задании, возможно, вы не выбрали правильный тип действия при первом его создании (новое действие - действие с вкладками).
Обратите внимание, что в последних 3 абзацах я говорю о видео! Поэтому, когда я говорю «основное действие XML», это основное действие XML в видео, которое в вашей ситуации является XML-файлом MotherActivity.