Как получить данные из DialogFragment в fragment?

Представьте себе, что у меня есть FragmentA, из которого я запускаю DialogFragment (есть окно EditText в поле). Как мне вернуть значение из EditText в FragmentA ? Я пытаюсь сделать что-то подобное, и это, но я не был успешным.

Метод Fragment.onActivityResult() полезен в этой ситуации. Требуется getTargetRequestCode() , который представляет собой код, который вы настроили между fragmentами, чтобы их можно было идентифицировать. Кроме того, он принимает код запроса, как правило, 0 если код работает хорошо, а затем Intent , который вы также можете присоединить к строке

 Intent intent = new Intent(); intent.putExtra("STRING_RESULT", str); 

Кроме того, setTargetFragment(Fragment, requestCode) должен использоваться во fragmentе, который отправляется с целью идентификации. В целом, у вас будет код в запрашивающем fragmentе, который выглядит так:

 FragmentManager fm = getActivity().getSupportFragmentManager(); DialogFragment dialogFragment = new DialogFragment(); dialogFragment.setTargetFragment(this, REQUEST_CODE); dialogFragment.show(); 

Класс для отправки данных (DialogFragment) будет использовать этот Фрагмент, который мы только что определили, чтобы отправить данные:

 private void sendResult(int REQUEST_CODE) { Intent intent = new Intent(); intent.putStringExtra(EDIT_TEXT_BUNDLE_KEY, editTextString); getTargetFragment().onActivityResult( getTargetRequestCode(), REQUEST_CODE, intent); } 

Чтобы получить данные, мы используем этот тип classа в Фрагменте, который изначально запустил DialogFragment:

 public void onActivityResult(int requestCode, int resultCode, Intent data) { // Make sure fragment codes match up if (requestCode == DialogFragment.REQUEST_CODE) { String editTextString = data.getStringExtra( DialogFragment.EDIT_TEXT_BUNDLE_KEY); 

На этом этапе у вас есть строка из вашего EditText из DialogFragment « DialogFragment в родительском fragmentе. Просто используйте метод sendResult(int) в вашем анонимном classе TextChangeListener() чтобы текст был отправлен, когда вам это нужно.

Вам необходимо отправить данные из диалогового windows обратно в действие с помощью метода обратного вызова, а затем передать данные обратно fragmentу, к которому вы хотите перейти. Просто быстрый пример:

 public void datFromDialog(String data){ MyFragment mf = (MyFragment)getFragmentManager().findFragmentById(r.id.frag); mf.iWantNewData(data); } 

Предположим, что вы загружаете какой-либо файл на сервер, нажав кнопку загрузки, откроется диалоговое окно, предложив заголовок и дополнительный тег. И сам диалог, содержащий 2 кнопки, отменит и продолжит.

создайте пользовательский интерфейс, как вам угодно, с помощью макета xml-файла.

затем создайте один class, расширяющий DialogFragment. раздуйте макет и инициализируйте представления внутри метода onCreateView ().

Внутри этого classа создается один интерфейс

  public interface uploadDialogInterface { public void senddata(String title, String tag); } uploadDialogInterface interfaceObj; String title=""; String tag=" "; 

И важно то, что вам нужно переопределить метод onAttach ()

  @Override public void onAttach(Context context) { super.onAttach(context); this.context=context; interfaceObj= (uploadDialogInterface) getTargetFragment(); } 

И при нажатии кнопки «Нажать» метод интерфейса, например

  @Override public void onClick(View v) { int id=v.getId(); if(id== R.id.vB_fud_cancel) { dismiss(); } else if(id== R.id.vB_fud_upload) { title=mVideotitle.getText().toString(); tag=mOptionaltag.getText().toString(); if(mVideotitle.getText().toString().isEmpty()) { Snackbar.make(mVideotitle,"Please enter the video title", Snackbar.LENGTH_SHORT).show(); }else { interfaceObj.senddata(title,tag); dismiss(); } } } 

И внутри fragmentа или активности, с которой вы запускаете диалог, должен быть включен атрибут setTargetFragment.

 private void callUploadDialog() { UploadDialogFragment fragment = new UploadDialogFragment(); fragment.setTargetFragment(this, 0); FragmentManager manager = getFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_in); fragment.show(ft, "UploadDialogFragment"); fragment.setCancelable(false); } 

И, наконец, вы должны реализовать интерфейс (который был объявлен внутри fragmentа диалога) и переопределить метод

 @Override public void senddata(String title,String optionaltag) { this.videoTitle=title; this.optionalTag=optionaltag; } 

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

Что вы хотите, по словам разработчиков Android …

Этот метод гарантирует, что вызывающий fragment реализует onChangeListener диалогового windows.

FragmentA (вызывающий fragment):

 MyDialogFragment f = new MyDialogFragment(); Bundle args = new Bundle(); args.putString("data", data); f.setArguments(args); // Set the calling fragment for this dialog. f.setTargetFragment(FragmentA.this, 0); f.show(getActivity().getSupportFragmentManager(), "MyDialogFragment"); 

MyDialogFragment:

 import android.support.v4.app.DialogFragment; public class MyDialogFragment extends DialogFragment { public OnChangeListener onChangeListener; interface OnChangeListener{ void onChange(Data data); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get the calling fragment and ensure that it implements onChangeListener. try { onChangeListener = (OnChangeListener) getTargetFragment(); } catch (ClassCastException e) { throw new ClassCastException( "The calling Fragment must implement MyDialogFragment.onChangeListener"); } } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { ..... builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Send the data to the calling fragment. onChangeListener.onChange(data); } }); ..... } } 
  • Меню Android Options в fragmentе
  • Показать диалоговое окно с анимацией, растущей с точки
  • Использование контекста в fragmentе
  • Начать операцию из fragmentа
  • Обновление данных в ListFragment как часть ViewPager
  • Когда fragment fragmentа с SwipeRefreshLayout во время обновления, fragment замерзает, но на самом деле все еще работает
  • fragment жизненного цикла: когда «ondestroy» и «ondestroyview» не называются?
  • Панель инструментов Android Добавление элементов меню для разных fragmentов
  • панель действий вверх с fragmentами
  • Как обновить fragment, который имеет Gridview, заполненный Sqlite
  • Фрагмент onCreateView и onActivityCreated вызывается дважды
  • Interesting Posts

    Активное окно (программа) неожиданно теряет фокус в Windows 7

    Boost Spirit: «Семантические действия – это зло»?

    Не удалось использовать ручку после очистки после использования командной строки

    Сохранить все открытые окна / вкладки?

    Как установить Json.Net в качестве сериализатора по умолчанию для службы WCF REST

    Как аутентифицировать пользователя только с учетной записью Google в действиях в Google?

    Использование Maven для развертывания

    Итеративный декартово произведение в Java

    игнорировать NA в строке dplyr row

    Какая папка является корзиной в Win7? Как проверить файлы там?

    Как использовать пользовательский Serializer с Jackson?

    Объединить много кадров данных из файлов csv, когда подразумевается столбец идентификатора?

    Как включить подтверждение предупреждения перед закрытием вкладок Chrome?

    Связывание видимости DataGridTextColumn

    MySQL ERROR 1290 (HY000) – опция -secure-file-priv

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