Android Как вызвать метод фрагмента из положительного нажатия кнопки DialogFragment

Я расширил DialogFragment и вызываю его из фрагмента (используя библиотеки поддержки, например, android.support.v4.app.Fragment)

Фрагмент реализует следующий интерфейс, содержащий метод doPositiveClick().

public interface CustomFieldsFragmentAlertDialog {
    public abstract void doPositiveClick();
}

Чтобы показать диалог, я вызываю:

CustomFieldsDialogFragment dialog = CustomFieldsDialogFragment.newInstance();
dialog.show(getFragmentManager(), "fragmentDialog");

Вот мой класс DialogFragment

public static class CustomFieldsDialogFragment extends DialogFragment{          

        public static CustomFieldsDialogFragment newInstance() {

            CustomFieldsDialogFragment frag = new CustomFieldsDialogFragment();             
            return frag;
        }   


        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {               

            Builder builder = new AlertDialog.Builder(getActivity()); 
            builder.setTitle("Title");                
            builder.setPositiveButton(posButtonText, new DialogInterface.OnClickListener() {                        

                    @Override
                    public void onClick(DialogInterface dialog, int which) {                            
                        ((CustomFieldsFragmentAlertDialog)getTargetFragment()).doPositiveClick();

                    }
                });
            }                

            return builder.create();

        }       
    }

Приложение аварийно завершает работу с исключением нулевого указателя при попытке выполнить строку ((CustomFieldsFragmentAlertDialog)getTargetFragment()).doPositiveClick();

10-05 13:45:23.550: E/AndroidRuntime(29228): java.lang.NullPointerException 10-05 13:45:23.550: E/AndroidRuntime(29228): в com.company.app.CustomFieldsFragment$CustomFieldsDialogFragment$1.onClick (Кастомфиелдсфрагмент.java:194)

Как я могу вызвать метод doPositiveClick(), существующий во фрагменте, который вызывает CustomFieldsFragmentAlertDialog?

Примечание. На сайте разработчиков Android показан пример http://developer.android.com/reference/android/app/DialogFragment.html#AlertDialog, в котором используется строка ((FragmentAlertDialog)getActivity()).doPositiveClick();, но я звоню из фрагмента, а не из действия.

Спасибо,


person Dittimon    schedule 05.10.2012    source источник


Ответы (2)


В строке ((FragmentAlertDialog)getActivity()).doPositiveClick(); действие реализует интерфейс, поэтому вы можете преобразовать действие в класс интерфейса.

В вашем случае вы хотите передать целевой фрагмент в интерфейс, поэтому ваш целевой фрагмент должен реализовать интерфейс, иначе он даст вам ClassCastException. Но вы получаете NullPointerExeception, чтобы убедиться, что метод getTargetFragment() не возвращает нулевой объект.

person Dharmendra    schedule 05.10.2012
comment
Спасибо за ответ, да, похоже, что моя проблема на самом деле заключается в получении объекта фрагмента из диалогового окна методом положительного клика. Вы знаете, как этого можно добиться? - person Dittimon; 05.10.2012
comment
Мне удалось получить фрагмент через FragmentManager (метод fragmentManager.findFragmentById()). Теперь работает, спасибо. - person Dittimon; 05.10.2012

Я не вижу, чтобы вы инициализировали свой интерфейс перед его вызовом, вы можете добиться этого следующим образом:

CustomFieldsFragmentAlertDialog mListener;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception.
    try {
        mListener = (CustomFieldsFragmentAlertDialog) getFragmentManager().findFragmentByTag(hostFragmentTag);
    } catch (ClassCastException e) {
        throw new ClassCastException(getFragmentManager()
                .findFragmentByTag(hostFragmentTag).toString()
                + " must implement CustomFieldsFragmentAlertDialog");
    }
}

Не забудьте реализовать свой Listener в вызывающем (хостовом) фрагменте, иначе он выдаст исключение.

Чтобы избежать сбоя, рекомендуется всегда проверять Listeners на null перед их вызовом, поэтому ваш код будет выглядеть так:

if(mListener != null)
    mListener.doPositiveClick();
person Nauman Zubair    schedule 04.06.2014