2017-02-22 3 views
1

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

Пример:

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"); 

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

Предложение оценили, спасибо

+0

Спасибо за предложение ребята, они где все полезные – Tajinere

+0

Используйте LocalBroadcastManager https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html отправить трансляцию из MainFragment и получить его в диалоге Фрагмент –

ответ

0
public void setStatus(String value){ 

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

} 
1

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

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

0

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

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

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

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

+0

разве это не приведет к краху приложения? – Tajinere

+0

До тех пор, пока оба диалогового окна и текстовое поле не являются нулевыми, это не должно падать. Поскольку вы инициализируете текстовое поле и не показываете никакого кода, который устанавливает его в null, не должно быть проблем с этим, пока отображается диалоговое окно. (Просто убедитесь, что диалог действительно находится в состоянии, которое вы ожидаете. Если вы хотите убедиться, что (stuff! = Null) является вашим другом) – Syzygy

Смежные вопросы