Как выполнить действие после нажатия положительной кнопки DialogFragment

Я создал следующий DialogFragment, взяв его из документации Android:

открытый класс PayBillDialogFragment расширяет DialogFragment{

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState){

        final Bundle b = this.getArguments();
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("Paga bollettino")
               .setPositiveButton("Paga", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // FIRE ZE MISSILES!


                   }
               })
               .setNegativeButton("Cancella", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // User cancelled the dialog
                   }
               });
        // Create the AlertDialog object and return it
        return builder.create();

    }





}

Из другого фрагмента (ListFragment) при щелчке строки списка следует открыть DialogFragment, и после нажатия положительной кнопки DialogFragment я хочу иметь возможность удалить выбранную строку ListFragment, а также вызвать метод для выполнить удаленное действие, связанное с удалением. Я реализовал ListFragment следующим образом:

public static class ListFragment extends android.support.v4.app.ListFragment {



        ArrayList<String> listItems=new ArrayList<String>();


        ArrayAdapter<String> adapter;


        public static final String ARG_SECTION_NUMBER = "section_number";

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            final View rootView = inflater.inflate(R.layout.list_fragment_view,
                    container, false);


            ListView lv = (ListView)rootView.findViewById(android.R.id.list);

            }});
            adapter=new ArrayAdapter<String>(this.getActivity(),
                    android.R.layout.simple_list_item_1,
                    listItems);
                setListAdapter(adapter);
            return rootView;
        }



        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {



            //opening the dialogfragment


        }


    }




    }

Чего я не знаю, так это того, как обрабатывать действие после нажатия положительной кнопки DialogFragment. Вы можете помочь мне?

РЕДАКТИРОВАТЬ: чтобы уточнить, это рабочий процесс: нажмите на список -> показать DialogFragment -> после нажатия на DialogFragment удалите элемент из списка.


person Raffo    schedule 12.04.2013    source источник


Ответы (4)


Вот как я обрабатываю связь между фрагментом и фрагментом диалога

Фрагмент примера:

public class MainFragment extends Fragment {

    private static final int REQ_CODE = 1;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.main_fragment, container, false);
        Button b = (Button) v.findViewById(R.id.button);
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                MyDialog dialog = new MyDialog();
                dialog.setTargetFragment(MainFragment.this, REQ_CODE);
                dialog.show(getFragmentManager(), "dialog");
            }
        });
        return v;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Toast.makeText(getActivity(), "Result: " + resultCode,
                Toast.LENGTH_SHORT).show();
        super.onActivityResult(requestCode, resultCode, data);
    }

}

Пример фрагмента диалога:

public class MyDialog extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("My dialog message")
                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        notifyToTarget(Activity.RESULT_OK);
                    }
                })
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                notifyToTarget(Activity.RESULT_CANCELED);
                            }
                        });
        return builder.create();
    }

    private void notifyToTarget(int code) {
        Fragment targetFragment = getTargetFragment();
        if (targetFragment != null) {
            targetFragment.onActivityResult(getTargetRequestCode(), code, null);
        }
    }

}

Это единственный метод, который у меня работал и при смене ориентации.

person rciovati    schedule 18.04.2013

У вас есть два варианта вызова ListFragment из PayBillDialogFragment.

Первый рекомендуется в соответствии с рекомендациями Android. Все общение идет через хостинг Activity. Вот как вы получаете хостинг Activity, позвонив ((HostingActivity)PayBillDialogFragment.getActivity()).deleteItem() внутри PayBillDialogFragment.setPositiveButton(onClick()). В HostingActivity.deleteItem() получить раздутый PayBillDialogFragment и вызвать в нем какой-нибудь метод удаления.

См. http://developer.android.com/guide/components/fragments.html#EventCallbacks

Второй. Вы можете просто DialogFragment.setTargetFragment() создать объект DialogFragment, а затем внутри PayBillDialogFragment.setPositiveButton(onClick()) вы можете получить PayBillDialogFragment по DialogFragment.getTargetFragment() и вызвать там метод удаления.

См. обратный вызов к фрагменту из диалогового фрагмента.

person riwnodennyk    schedule 18.04.2013

Для вызова диалога вы можете использовать это:

android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
if (fm.findFragmentByTag("PayBillDialogFragment") == null) {
    PayBillDialogFragment payBillDialogFragment = new PayBillDialogFragment();
    payBillDialogFragment.show(fm, "PayBillDialogFragment");
}

В вашем диалоговом фрагменте

setPositiveButton("Paga", new DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int id) {
       //Add your code here that should execute
       //when positive button is clicked
   }
});
person Homam    schedule 12.04.2013
comment
Я не понимаю. Как мне удалить элементы из arraylist/arrayadapter из метода onClick? - person Raffo; 12.04.2013

Фрагмент списка будет использовать адаптер для отображения элементов. Адаптер требует ввода в виде некоторой коллекции. Итак, что вы можете сделать, так это то, что когда пользователь нажимает кнопку «ОК» во фрагменте диалога, и вы сообщаете об этом обратно фрагменту списка, вы можете удалить этот конкретный элемент из коллекции и снова установить адаптер фрагмента списка с измененной коллекцией.

person takesavy    schedule 25.04.2014