2015-11-10 2 views
1

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

Я использую код из первого ответа этой ссылки stackoverflow question, но эта часть кода не работает, потому что у меня есть фрагмент, а не активность. Метод onDismiss вызывается в диалоговомфрагменте, но оператор if терпит неудачу и поэтому не вызывает фрагмент. Я попытался заменить эту часть с помощью getFragmentManager и с getParentFragment и get/setTargetFragment, но не работает.

Кто-то может мне помочь?

public void onDismiss(final DialogInterface dialog) { 
    super.onDismiss(dialog); 

    // code I've tried 
    final FragmentManager fragment = getFragmentManager(); 
    if (fragment instanceof DialogInterface.OnDismissListener) { 
     ((DialogInterface.OnDismissListener) fragment).onDismiss(dialog); 
    } 

    // original answer code 
    /*final Activity activity = getActivity(); 
    if (activity instanceof DialogInterface.OnDismissListener) { 
     ((DialogInterface.OnDismissListener) activity).onDismiss(dialog); 
    }*/ 

} 
+0

Вы пробовали обратный вызов интерфейса? – droidev

+0

Я довольно новичок в Android, вы можете объяснить мне больше, пожалуйста? – pnappa

+0

проверить ответ – droidev

ответ

0

Я думаю, что вы можете еще один способ заархивировать:

// create a function in YourFragment 
public void myDissmiss(); 
// change your newInstance(bitmap) of your dialog fragment 
public static DialogFragmentImage newInstance(Bitmap b,YourFragment f); 

, то вы можете позвонить yourfragment.myDissmiss() в вашем public void onDismiss(final DialogInterface dialog) из DialogFragmentImage.

+0

Прошу прощения, я не понимаю вашего ответа. – pnappa

0

Вы можете попробовать интерфейс перезвонить,

создать интерфейс в диалоговом фрагменту

public interface Listener{ 
    void onDismiss(); 
    } 

реализовать это в вашем фрагменте

public class MyFragment extends Fragment implements MyDialogFragment.Listener{ 

    @Override 
public void onDismiss(){ 
    //write the operations here 
} 
} 

сейчас в диалоговом фрагменту Получать объект вашего исходного фрагмента, ex:

public void setListener(Listener listener){ 
this.mListener = listener; 
} 

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

теперь в вашем onDismiss() вашего диалога вызова фрагмента onDismiss, используя эту ссылку

экс

@Override 
public void onDismiss(){ 
    mListener.onDismiss(); 
} 

Продлайт necessory Null проверяет

проверить это ниже ссылку слишком

How to get button clicks in host fragment from dialog fragment

+0

, когда я использую setListener (это), не работает, потому что я в View.OnClickListener, поэтому не принимаю «это». Любой совет? – pnappa

+0

Опубликовать обновленный код – droidev

+0

Я решил это, я использую совершенно другой подход. Спасибо за ваше время. – pnappa

1

T его старая проблема, но я не нашел решения, которым я доволен. Мне не нравится передавать никаких прослушивателей в свой диалог DialogFragment или устанавливать TargetFragment, потому что это может нарушить изменение ориентации. Что Вы думаете об этом?

MyDialog d = new MyDialog(); 
     d.show(fragmentManager, "tag"); 
     fragmentManager.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() { 
       @Override 
      public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) { 
       super.onFragmentViewDestroyed(fm, f); 
       //do sth  
     fragmentManager.unregisterFragmentLifecycleCallbacks(this); 
       } 
      }, false); 
+0

Я полностью изменил свой код, чтобы найти решение, это был старый проект, который был закончен 1 год назад, поэтому я не могу попробовать этот новый код для решения моей старой проблемы. Кстати, код, который вы опубликовали, должен работать, и мне также нравится, что вы также ответили на старый вопрос. – pnappa

+0

Честно говоря, я даже нашел лучшее решение. Причина, по которой вы не можете использовать getDialog в диалоговом окне DialogFragment, а затем установить приемник отклонения, заключается в том, что FragmentTransaction не был выполнен. Поэтому, когда вы выполняетеPendingTransactions на FragmentManager getDialog не возвращает null. – Kaskasi