Android - Обновить «родительский» фрагмент, когда DialogFragment отклонен - PullRequest
3 голосов
/ 10 марта 2012

Я создаю приложение Android с макетом с вкладками, используя Tabhost и Fragments.

На одной из вкладок (фрагмент) у меня есть текстовое представление, которое отображает значение переменной String.На этой вкладке также есть кнопка, которая вызывает DialogFragment, в котором я могу редактировать значение указанной строки через поле EditText.

Все работает как положено, за исключением одного сбоя: после того, как DialogFragment отклонен и вкладка снова получает фокус, текстовый вид не обновляется автоматически.Чтобы он обновился, мне нужно изменить вкладку и вернуться.

Можно ли добавить инструкцию, чтобы при отклонении DialogFragment родительская активность перезагружалась / обновлялась?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Все еще ищетерешение, не могу понять, как использовать DialogFragment.isdetached

Ответы [ 6 ]

9 голосов
/ 01 июня 2012

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

У меня была похожая ситуация: отображался фрагмент DialogFragment из фрагмента, где DialogFragment должен сообщать о своем «отклонении» фрагменту.

В вашем случае вы, кажется, используете (Fragment) Activity вместо Fragment, но я думаю, что здесь нет никакой разницы.

Steps

  1. Создайте частный класс в вашей Деятельности, который расширяет Обработчик. Переопределите onHandleMessage () и обновите ваши TextViews там.
  2. Передайте экземпляр YourDialogFragmentDismissHandler в YourDialogFragment, например, через конструктор
  3. Переопределите onDismiss () в YourDialogFragment и отправьте сообщение, самое простое, пустое, через экземпляр YourDialogFragmentDismissHandler.

код

public class YourActivity extends Activity {
    ...
    public void someMethod() {
        ...
        YourDialoagFragment yourDialoagFragment = 
            new YourDialoagFragment(new YourDialogFragmentDismissHandler());
        yourDialoagFragment.show();
        ...
    }

    private class YourDialogFragmentDismissHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            // refresh your textview's here
        }   
    }
    ...
}


public class YourDialoagFragment extends DialoagFragment {
    ...
    Handler handler;

    public YourDialoagFragment(Handler handler) {
        this.handler = handler
    }
    ...
    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);

        handler.sendEmptyMessage(0);
    }
    ...
}

Надеюсь, это поможет!

2 голосов
/ 18 сентября 2013

Я всегда использую простую обратную связь с методом onAttach () (но мне действительно нравится решение stefanjunker). Просто позвольте вашей деятельности реализовать FeedbackListener и реализовать его методы, а затем разверните ваш DialogFragment следующим образом:

public class SomeDialog extends DialogFragment {
    private FeedbackListener feedbackListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            feedbackListener = (FeedbackListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement FeedbackListener");
        }
    }

    public void onButtonPushed(View view) {
        feedbackListener.doSomething();
    }

    public interface FeedbackListener {
        public void doSomething();
    }
}
1 голос
/ 17 октября 2012

Ваша проблема в том, что действие dialogFragment влияет на данные или представление предыдущего фрагмента. И вы хотите обновить данные или представление предыдущего фрагмента после закрытия диалогового фрагмента. Но отклонение предыдущего диалогового фрагмента не может вызвать предыдущий фрагмент onCreateView() или onCreate(). В этом затруднительном положении вы можете использовать Broadcast. Когда вы обновляете данные предыдущего фрагмента или просматриваете данные. Вы можете отправить трансляцию. Как только предыдущий фрагмент получит широковещательную рассылку, предыдущий фрагмент может обновляться сейчас, а не при закрытии фрагмента диалога. Я думаю, что это лучшее решение, особенно в многопоточности.

1 голос
/ 10 марта 2012

вы можете использовать myDialogFragment.isDetached (), которые возвращают логическое значение, когда оно отсоединено, и вызывают метод, в котором вы можете написать код для отображения снова.

0 голосов
/ 08 февраля 2018

Я знаю, что это не отвечает на ваш вопрос, поскольку он сформулирован, но я не понимаю, почему это не сработает в вашем случае.Есть еще одно решение, если это не работает.

В вашем коде для DialogFragment.

TextView tv = (TextView) getActivity().findViewById(R.id.Your_id); 

tv.setText("new string");
0 голосов
/ 31 августа 2015

Идеальный ответ такой: (Это пример кода из моего приложения)

Сначала определите интерфейс в DialogFragment:

public interface PasswordCreatedCallback{
    void refreshJobsScreen(boolean succesful);
}

И *; 1006 *

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        callback = (PasswordCreatedCallback) getTargetFragment();
    } catch (ClassCastException e) {
        throw new ClassCastException("Calling fragment must implement PasswordCreatedListener interface");
    }
}

И setTargetFragment из родительского фрагмента так:

final PasswordCreateDialogFragment passwordDialog = PasswordCreateDialogFragment.newInstance("");
                    passwordDialog.setTargetFragment(ViewPagerFragment.this, Constants.PASSWORD_CREATED);

Вы можете вызывать свой метод обратного вызова в любое время, и ваш родительский фрагмент будет уведомлен вашим методом обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...