Как передать данные во фрагмент диалога, пока он отображается

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

Пример:

class MyDFrag extends DialogFragment{

      //Empty Construct
      public MyDFrag(){}

      public static MyDFrag newInstance(){

          MyDFrag fragment = new MyDFrag();
          args = new Bundle();
          fragment.setArgument(args);

      }

}

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

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

Передача аргумента после показа диалога не влияет на это изменение.

В моем onCreate:

public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    textbox = (TextView) view.findViewById(R.id.textish);

    if(args.containsKey("status")){
        textbox.setText(getArguments().getString("status"));
    }

}

В диалоговом классе у меня есть открытый диалог, который устанавливает значение textview, которое я затем вызываю в своей основной деятельности в какой-то момент.

public void setStatus(String value){
    args.putString("status", value);
}

Поэтому, когда я буду готов в своей основной деятельности, я звоню

dialog.setStatus("ok");

Это работает, только если я запускаю код, прежде чем показывать диалоговое окно, а не его показ. Есть ли способ добиться этого?

Предложение приветствуется, спасибо

3 ответа

Решение
public void setStatus(String value){

    if(textbox!=null){
        textbox.setText(value);
    }else{
        args.putString("status", value);
    }

}

Я считаю, что есть несколько способов сделать это. По сути, как я понимаю, вам нужно иметь возможность асинхронно отправлять сообщение в диалог, что что-то изменилось и пользовательский интерфейс нуждается в обновлении. Я хотел бы предложить использовать LocalBroadcastManager: https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

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

Исходя из того, что вы опубликовали, код не определяет, когда есть изменение аргументов, и поэтому он не считывает аргументы снова, чтобы установить ваши изменения.

Но бессмысленно устанавливать аргументы в первую очередь, если все, что вы делаете, это просто один раз считываете их, вместо этого я рекомендую вам напрямую установить текст в вашем методе setStatus так (не могу заставить форматирование кода работать по какой-то причине правильно)):

public void setStatus(String value){ textbox.setText(value); }

Обратите внимание, что пользовательский код никогда не должен быть жестко закодирован, вместо этого используйте строковые ресурсы.

Другие вопросы по тегам