Передача данных между fragmentом и его контейнерной активностью

Как передать данные между fragmentом и его активностью в контейнере? Есть ли что-то похожее на передачу данных между действиями через намерения?

Я читал это, но это не помогло:
http://developer.android.com/guide/topics/fundamentals/fragments.html#CommunicatingWithActivity

В fragmentе вы можете вызвать getActivity() .

Это даст вам доступ к активности, создавшей fragment. Оттуда вы можете, очевидно, называть какие-либо методы доступа, которые находятся в действии.

например, для метода, называемого getResult() в вашей деятельности:

 ((MyActivity) getActivity()).getResult(); 

Попробуйте использовать интерфейсы.

Любой fragment, который должен передать данные обратно в его содержащую активность, должен объявить интерфейс для обработки и передачи данных. Затем убедитесь, что ваша содержащая активность реализует эти интерфейсы. Например:

В своем fragmentе объявите интерфейс …

 public interface OnDataPass { public void onDataPass(String data); } 

Затем подключите реализацию classа classа к fragmentу в методе onAttach, например:

 OnDataPass dataPasser; @Override public void onAttach(Context context) { super.onAttach(context); dataPasser = (OnDataPass) context; } 

Внутри вашего fragmentа, когда вам нужно обрабатывать передачу данных, просто вызовите его на объекте dataPasser:

 public void passData(String data) { dataPasser.onDataPass(data); } 

Наконец, в вашей содержательной деятельности, которая реализует OnDataPass

 @Override public void onDataPass(String data) { Log.d("LOG","hello " + data); } 
 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle b = getActivity().getIntent().getExtras(); wid = b.getString("wid"); rid = b.getString("rid"); View view = inflater.inflate(R.layout.categoryfragment, container, false); return view; } 

Самый простой подход, но не рекомендуется

Вы можете получить доступ к данным активности из fragmentа:

Мероприятия:

 public class MyActivity extends Activity { private String myString = "hello"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); ... } public String getMyData() { return myString; } } 

Фрагмент:

 public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { MyActivity activity = (MyActivity) getActivity(); String myDataFromActivity = activity.getMyData(); return view; } } 

Передача данных между fragmentом и его контейнерной активностью

Мероприятия:

  Bundle bundle = new Bundle(); bundle.putString("message", "Alo Elena!"); FragmentClass fragInfo = new FragmentClass(); fragInfo.setArguments(bundle); transaction.replace(R.id.fragment_single, fragInfo); transaction.commit(); 

Фрагмент:

Чтение значения в fragmentе

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { String myValue = this.getArguments().getString("message"); ... ... ... } 

Я не знаю, является ли это лучшим способом или нет. Я довольно долго искал в google поиски, как я могу передать Bundle из fragmentа в свою активность в контейнере, но все, что я нашел, это отправка данных из активности в fragment вместо (что было немного запутанным для меня, поскольку я новичок).

позже я попробовал что-то свое собственное, которое точно работало для меня так, как я хотел. поэтому я отправлю его здесь, если кто-то вроде меня ищет то же самое.

// Передача данных из fragmentа.

 Bundle gameData = new Bundle(); gameData.putStringArrayList(Constant.KEY_PLAYERS_ARR,players); gameData.putString(Constant.KEY_TEAM_NAME,custom_team_name); gameData.putInt(Constant.KEY_REQUESTED_OVER,requestedOver); Intent intent = getActivity().getIntent(); intent.putExtras(gameData); 

// Получение данных из пакета из его активности в контейнере.

 Bundle gameData = getIntent().getExtras(); if (gameData != null) { int over = gameData.getInt(Constant.KEY_REQUESTED_OVER); ArrayList players = gameData.getStringArrayList(Constant.KEY_PLAYERS_ARR); String team = gameData.getString(Constant.KEY_TEAM_NAME); } else if (gameData == null) { Toast.makeText(this, "Bundle is null", Toast.LENGTH_SHORT).show(); } 

Интерфейс – одно из лучших решений:

Интерфейс клея:

 public interface DataProviderFromActivity { public String getName(); public String getId); } 

MyActivity:

 public class MyActivity implements DataProviderFromActivity{ String name = "Makarov"; String id = "sys533"; ... ... ... ... ... .... .... ... ... ... ... ... .... .... public String getName(){ return name; }; public String getId(){ return id; }; } 

MyFragment:

 public class MyFragment extends Fragment{ String fragName = ""; String fragId = ""; ... ... ... ... ... .... .... ... ... ... ... ... .... .... @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); DataProviderFromActivity myActivity= (DataProviderFromActivity) getActivity(); fragName = myActivity.getName(); fragId = myActivity.getId(); ... ... ... ... ... .... .... ... ... ... ... ... .... .... updateFragmentView(); } } 

Я использовал AppCompatActivity, который реализует Listen Listers. Фрагменты возникли как необходимость, так как мне нужно было закодировать селектор диапазона дат. И мне также понадобился контейнер для получения выбранных дат, чтобы вернуть их родительской активности.

Для активности контейнера это объявление classа:

 public class AppCompatDateRange extends AppCompatActivity implements DateIniRangeFragment.OnDateIniSelectedListener, DateFimRangeFragment.OnDateFimSelectedListener 

И интерфейсы для обратных вызовов:

 @Override public void onDateIniSelected(String dataIni) { Log.i("data inicial:", dataIni); } @Override public void onDateFimSelected(String dataFim) { Log.i("data final:", dataFim); } 

Обратные вызовы являются строками, поскольку даты являются параметрами в выборе запроса.

Код для fragmentов (на основе fragmentа исходной даты):

 public class DateIniRangeFragment extends Fragment { OnDateIniSelectedListener callbackIni; private DatePicker startDatePicker; public DateIniRangeFragment() { ///required empty constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } ///through this interface the fragment sends data to the container activity public interface OnDateIniSelectedListener { void onDateIniSelected(String dataIni); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ///layout for the fragment View v = inflater.inflate(R.layout.date_ini_fragment, container, false); ///initial date for the picker, in this case, current date startDatePicker = (DatePicker) v.findViewById(R.id.start_date_picker_appcompat); Calendar c = Calendar.getInstance(); int ano = c.get(Calendar.YEAR); int mes = c.get(Calendar.MONTH); int dia = c.get(Calendar.DAY_OF_MONTH); startDatePicker.setSpinnersShown(false); startDatePicker.init(ano, mes, dia, dateSetListener); return v; } ///listener that receives the selected date private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() { public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if (view.isShown()) { ///if the datepicker is on the screen String sDataIni = year + "-" + (monthOfYear + 1) + "-" + dayOfMonth; callbackIni.onDateIniSelected(sDataIni); //apply date to callback, string format } } }; @Override public void onAttach(Activity activity) { super.onAttach(activity); /* * this function guarantees that the container activity implemented the callback interface * */ try { callbackIni = (OnDateIniSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " deve implementar OnDateIniSelectedListener"); } } 

}

Чтобы составить контейнер + fragmentы, я использовал ViewPager (AppCompat) с пользовательским classом, который расширяет FragmentPagerAdapter. Нет диалогов.

Просто вы можете использовать EventBus, это просто и отлично работает

EventBus за 3 шага

  1. Определить события:

    public static class MessageEvent { /* Additional fields if needed */ }

  2. Подготовьте подписчиков: объявите и аннотируйте свой метод подписки, опционально укажите режим streamа:

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {/* Do something */};

Зарегистрируйте и отмените регистрацию своего подписчика. Например, на Android, действия и fragmentы должны обычно регистрироваться в соответствии со своим жизненным циклом:

  @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } 
  1. Почтовые события:

    EventBus.getDefault().post(new MessageEvent());

Это работает на меня ..

в Activity добавьте этот метод

  public void GetData(String data) { // do something with your data } 

и в Фрагменте добавьте эту строку

 ((YourActivity)getContext).GetData("your data here"); 

Другой простой способ получить данные, переданные из другой активности, в fragmentе в активности контейнера: например:

Activity_A => Activity_B (fragment)

В вашей Activity_A вы создаете намерение, как будто вы отправляете данные (String здесь) в другое действие:

 Intent intent = new Intent(getBaseContext(),Activity_B.class); intent.putExtra("NAME", "Value"); startActivity(intent); 

в вашем fragmentе, содержащемся в вашем Activity_B:

 String data = getActivity().getIntent().getExtras(); 
  • Как определить, какая кнопка нажата на Android
  • Центр Выровнять название в панели действий, используя стили в android.
  • J2ME / Android / BlackBerry - маршруты проезда, маршрут между двумя точками
  • Анимированная иконка для ActionItem
  • Как показать диалог, подтверждающий, что пользователь хочет выйти из Android-активности?
  • Как позвонить в список контактов Android И выбрать один номер телефона со своего экрана сведений?
  • Как использовать TabLayout с панелью инструментов внутри CollapsingToolbarLayout?
  • Настраиваемые виджеты в Android
  • Как импортировать набор значков в проект Android Studio
  • Удалить тень под панелью действий
  • Переход от одного действия к другому. Активность в Android.
  • Interesting Posts

    Как я могу получить доступ к разделу Linux из Windows?

    Jquery live () vs delegate ()

    Перекачка сообщений StaTaskScheduler и STA

    Получить строку командной строки для настройки VLC с графическим интерфейсом

    Могу ли я поменять CTRL и ALT в KDE?

    Java: Самый эффективный метод для итерации по всем элементам в org.w3c.dom.Document?

    Как переименовать несколько файлов в нескольких папках с помощью одной команды

    Почему Iterable не предоставляет методы stream () и parallelStream ()?

    Какую строку формата я использую в миллисекундах в строках даты на iPhone?

    Лучшая практика использования $ rootcope в приложении Angularjs?

    ошибка установки npm – MSB3428: Не удалось загрузить компонент Visual C ++ «VCBuild.exe»

    Является ли отказ от приложения недоверчивым?

    Как перебирать файлы в каталоге с помощью Bash?

    Окно BSOD: «INACCESSIBLE_BOOT_DEVICE» после перераспределения и установки Ubuntu Gnome

    Разница и использование onCreate (), onCreateView () и onActivityCreated () в fragmentах

    Давайте будем гением компьютера.