Как да изпълним действие след щракване върху положителния бутон на 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);
    }

}

Примерен DialogFragment:

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() и да извикате метода за изтриване там.

Вижте Обратно извикване към фрагмент от DialogFragment

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