Как передать данные во фрагмент диалога, пока он отображается
По умолчанию, когда вам нужно передать аргумент в пользовательский фрагмент диалога, вы связываете его перед тем, как его использовать.
Пример:
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);
}
Обратите внимание, что пользовательский код никогда не должен быть жестко закодирован, вместо этого используйте строковые ресурсы.