Я новичок в использовании фрагментов.
Я просто пытаюсь создать простой пример приложения, использующего фрагменты. Мой сценарий: у меня есть два действия с одним фрагментом внутри каждого действия. Первый фрагмент имеет текст редактирования и кнопку. Второй фрагмент имеет текстовое представление. Когда я ввожу имя в текст редактирования и нажимаю кнопку, текстовое представление во втором фрагменте должно отображать имя, введенное в текст редактирования первого фрагмента.
Мне удалось отправить значение из первого фрагмента в его действие, а затем из этого действия во второе действие. Теперь, как мне использовать это значение во втором фрагменте.
Вот код Java :::
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Fragment_1 extends Fragment{
OnFragmentChangedListener mCallback;
// Container Activity must implement this interface
public interface OnFragmentChangedListener {
public void onButtonClicked(String name);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnFragmentChangedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_fragment_1, container, false);
final EditText edtxtPersonName_Fragment = (EditText) view.findViewById(R.id.edtxtPersonName);
Button btnSayHi_Fragment = (Button) view.findViewById(R.id.btnSayHi);
btnSayHi_Fragment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String name = edtxtPersonName_Fragment.getText().toString();
FragmentManager fm = getFragmentManager();
Fragment_2 f2 = (Fragment_2) fm.findFragmentById(R.id.fragment_content_2);
Activity activity = getActivity();
if(activity != null)
{
Toast.makeText(activity, "Say&ing Hi in Progress...", Toast.LENGTH_LONG).show();
}
if(f2 != null && f2.isInLayout())
{
f2.setName(name);
}
else
{
mCallback.onButtonClicked(name);
}
}
});
return view;
}
}
MainActivity.Java
package com.example.fragmentexample;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Choreographer.FrameCallback;
import android.view.Menu;
public class MainActivity extends Activity implements Fragment_1.OnFragmentChangedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public void onButtonClicked(String name) {
// TODO Auto-generated method stub
Intent i = new Intent(this, SecondActivity.class);
i.putExtra("", name);
startActivity(i);
}
}
SecondActivity.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Bundle b = getIntent().getExtras();
Fragment_2 f2 = new Fragment_2();
f2.setArguments(b);
}
}
Fragment_2.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Fragment_2 extends Fragment{
View view;
TextView txtName;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
view = inflater.inflate(R.layout.fragment_fragment_2, container, false);
// Exception at this line
String name = getArguments().getString("message");
txtName = (TextView) view.findViewById(R.id.txtViewResult);
txtName.setText(name);
return view;
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
}
public void setName(String name)
{
txtName.setText("Hi " + name);
}
}
Я получаю следующее исключение :::
04-16 18:10:24.573: E/AndroidRuntime(713): FATAL EXCEPTION: main
04-16 18:10:24.573: E/AndroidRuntime(713): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmentexample/com.example.fragmentexample.SecondActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.access$500(ActivityThread.java:122)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Looper.loop(Looper.java:132)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.main(ActivityThread.java:4123)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invoke(Method.java:491)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-16 18:10:24.573: E/AndroidRuntime(713): at dalvik.system.NativeStart.main(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.setContentView(Activity.java:1786)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.SecondActivity.onCreate(SecondActivity.java:13)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.performCreate(Activity.java:4397)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 11 more
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: java.lang.NullPointerException
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.Fragment_2.onCreateView(Fragment_2.java:24)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:754)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.onCreateView(Activity.java:4177)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 21 more
Как мне получить значение из пакета в SecondActivity.java в Fragment_2.Java?
источник
Ответы:
Шаг 1. отправить данные из фрагмента в действие
шаг 2. чтобы получить эти данные в Activity:
шаг 3 . для отправки данных из активности в другую деятельность следуйте нормальному подходу
шаг 4, чтобы получить эти данные в действии
Шаг 5. Из Activity вы можете отправлять данные в Fragment с целью:
и получить во фрагменте в методе Fragment onCreateView:
источник
bundle.putString("message", "From Activity");
Как отмечено на сайте разработчика
связь между фрагментами должна осуществляться через связанное действие.
У нас есть следующие компоненты:
Реализация FragmentA:
Реализация MainActivity:
Реализация FragmentB:
Я надеюсь, это поможет..
источник
// В Fragment_1.java
// В Fragment_2.java
Надеюсь, это поможет вам.
источник
putString
(илиputInt
) - это ответ!С веб-сайта разработчиков :
Вы можете общаться между фрагментами с помощью его Activity. Используя этот подход, вы можете общаться между активностью и фрагментом .
Пожалуйста, проверьте также эту ссылку.
источник
Во-первых, все ответы верны, вы можете передавать данные, кроме настраиваемых объектов, используя
Intent
. Если вы хотите передать настраиваемые объекты, вам необходимо реализоватьSerialazable
илиParcelable
в свой класс настраиваемых объектов. Я думал, что это слишком сложно ...Так что если ваш проект простой, попробуйте использовать
DataCache
. Это обеспечивает очень простой способ передачи данных. Ссылка: проект Github CachePot1- Установите для этого параметра View или Activity или Fragment, который будет отправлять данные
2- Получите данные где угодно, как показано ниже
источник
Последнее решение для передачи данных между фрагментами может быть реализовано с использованием архитектурных компонентов Android, таких как ViewModel и LiveData. С помощью этого решения вам не нужно определять интерфейс для связи и вы можете получить преимущества использования модели просмотра, такие как сохранение данных, из-за изменений конфигурации.
В этом решении участвующие в коммуникации фрагменты используют один и тот же объект модели представления, который привязан к их жизненному циклу активности. Объект модели представления содержит объект Liveata. Один фрагмент устанавливает данные, которые должны быть переданы объекту liveata, а второй фрагмент обозреватель изменяет данные, и получает данные.
Вот полный пример http://www.zoftino.com/passing-data-between-android-fragments-using-viewmodel
источник
Передача аргументов между фрагментами. Слишком поздно отвечать на этот вопрос, но это может кому-то помочь!
Fragment_1.java
Затем в вашем
Fragment_2.java
вы можете получить параметры обычно в своем,onActivityCreated
например,источник
Я думаю, что хороший способ решить эту проблему - использовать собственный интерфейс.
Допустим, у вас есть два фрагмента (A и B), которые находятся внутри одного действия, и вы хотите отправить данные из A в B.
Интерфейс:
Деятельность:
Фрагмент А:
Фрагмент B:
источник
Взаимодействие между фрагментами довольно сложно (я считаю, что концепцию слушателей немного сложно реализовать).
Обычно для абстрагирования этих коммуникаций используется «шина событий». Это сторонняя библиотека, которая заботится об этом за вас.
«Отто» - это то, что часто используется для этого, и, возможно, стоит изучить: http://square.github.io/otto/
источник
Передача данных из фрагмента в другой фрагмент
Из первого фрагмента
На втором фрагменте
источник
Эта простая реализация помогает простым способом передавать данные между фрагментами. Думаю, вы хотите передать данные из "Frgment1" в "Fragment2"
Во фрагменте1 (установить данные для отправки)
В методе Fragment2 onCreateView (получить параметры)
источник
Котлин путь
Используйте
SharedViewModel
предложенный в официальной документации ViewModelСначала реализуйте фрагмент-ktx, чтобы упростить создание вашей модели просмотра.
Затем вам просто нужно поместить в модель представления данные, которыми вы будете делиться с другим фрагментом.
Затем, чтобы закончить, просто создайте экземпляр вашей viewModel в каждом фрагменте и установите значение
selected
из фрагмента, для которого вы хотите установить данныеФрагмент А
А затем просто слушайте это значение в месте назначения фрагмента
Фрагмент B
Вы также можете сделать это наоборот
источник
100% рабочее решение: (если вам поможет, не забудьте проголосовать за)
В свой первый фрагмент поместите этот фрагмент кода:
Во втором фрагменте создайте метод, как показано ниже:
затем определите переменную на уровне класса:
затем сделайте другой метод во втором фрагменте, чтобы установить значение:
источник
Вы можете достичь своей цели с помощью ViewModel и Live Data, которые очищает Арнав Рао . Теперь я приведу пример, чтобы нагляднее это прояснить.
Во- первых, предполагается ,
ViewModel
называетсяSharedViewModel.java
.Тогда исходный фрагмент - это то,
MasterFragment.java
откуда мы хотим отправить данные.И, наконец, целевой фрагмент - это место,
DetailFragment.java
куда мы хотим получить данные.источник
Хорошо, после стольких копаний здесь я нашел простое решение, на самом деле вы никогда не должны передавать данные из фрагмента в фрагмент, это всегда плохая идея, вы можете передавать данные из фрагмента A в действие и получать данные из активности во фрагменте B.
// в основной деятельности
// теперь во FragmentB
источник
я сделал кое-что действительно легкое для новичков вроде меня ... я сделал текстовое представление в моем activity_main.xml и поместил
тогда я получаю это текстовое изображение из первого фрагмента
а затем во втором фрагменте я получаю значение
Надеюсь, поможет!
источник