Добавяне на положителен / отрицателен бутон към диалоговия прозорец на DialogFragment

Вече написах DialogFragment. Сега разбрах, че искам да има положителен и отрицателен бутон точно като AlertDialog. Как мога да постигна такова нещо, като поддържам кода, който съм написал?

public class DoublePlayerChooser extends DialogFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        

    setStyle(DialogFragment.STYLE_NORMAL,0);



}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    return new AlertDialog.Builder(getActivity())
            .setTitle("title")
            .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // do something...
                    }
                }
            )
            .setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.dismiss();
                    }
                }
            )
            .create();
}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.doubleplayerchooser, container, false);
    getDialog().setTitle("Enter Players");

    firstPlayerPicker =  (ImageButton) v.findViewById(R.id.imageButton1);
    firstPlayerPicker.setOnClickListener(new OnClickListener() {
        public void onClick(final View v){

            callContactPicker(1);

        }       
    });

    secondPlayerPicker =  (ImageButton) v.findViewById(R.id.ImageButton01);
    secondPlayerPicker.setOnClickListener(new OnClickListener() {
        public void onClick(final View v){

            callContactPicker(2);

        }       
    });

    loadFromFile =  (ImageButton) v.findViewById(R.id.imageButton2);
    loadFromFile.setOnClickListener(new OnClickListener() {
        public void onClick(final View v){



        }       
    });

    firstTextfield =  (EditText) v.findViewById(R.id.editText1);
    secondTextfield =  (EditText) v.findViewById(R.id.EditText01);

    firstImage = (ImageView) v.findViewById(R.id.imageView1);
    secondImage = (ImageView) v.findViewById(R.id.ImageView01);



    return v;
}

person Libathos    schedule 03.09.2013    source източник


Отговори (5)


Ето как го разбрах. Изтрих onCreateView и промених onCreateDialog. Тази връзка всъщност съдържаше отговора, така че цялата заслуга трябва да отиде там. Току-що го публикувах, в случай че някой първо се сблъска с този въпрос.

    @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog.Builder b=  new  AlertDialog.Builder(getActivity())
    .setTitle("Enter Players")
    .setPositiveButton("OK",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                // do something...
            }
        }
    )
    .setNegativeButton("Cancel",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                dialog.dismiss();
            }
        }
    );

    LayoutInflater i = getActivity().getLayoutInflater();

    View v = i.inflate(R.layout.doubleplayerchooser,null);

    firstPlayerPicker =  (ImageButton) v.findViewById(R.id.imageButton1);
    firstPlayerPicker.setOnClickListener(new OnClickListener() {
        public void onClick(final View v){

            callContactPicker(1);

        }       
    });

    secondPlayerPicker =  (ImageButton) v.findViewById(R.id.ImageButton01);
    secondPlayerPicker.setOnClickListener(new OnClickListener() {
        public void onClick(final View v){

            callContactPicker(2);

        }       
    });

    loadFromFile =  (ImageButton) v.findViewById(R.id.imageButton2);
    loadFromFile.setOnClickListener(new OnClickListener() {
        public void onClick(final View v){



        }       
    });

    firstTextfield =  (EditText) v.findViewById(R.id.editText1);
    secondTextfield =  (EditText) v.findViewById(R.id.EditText01);

    firstImage = (ImageView) v.findViewById(R.id.imageView1);
    secondImage = (ImageView) v.findViewById(R.id.ImageView01);


    b.setView(v);
    return b.create();
}
person Libathos    schedule 03.09.2013
comment
Би било много по-ясно, ако изгледът на съдържание все още е създаден в рамките на onCreateView(LayoutInflater.from(getActivity()),null,savedInstance). - person Meow Cat 2012; 10.03.2019

Трябва да замените метода DialogFragments onCreateDialog(...):

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    return new AlertDialog.Builder(getActivity())
            .setTitle("title")
            .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // do something...
                    }
                }
            )
            .setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.dismiss();
                    }
                }
            )
            .create();
}

Взето от тук: Android: деактивирайте бутоните OK/Отказ на DialogFragment

Според съобщението за грешка, което получавате („функцията за заявка трябва да бъде извикана...“), бих препоръчал:

Не извиквайте setContentView() преди requestFeature() във вашата дейност или където и да е, където го извиквате.

Освен това:

Не извиквайте setStyle(...) вътре в onCreate().

Наречете го там, където създавате своя фрагмент.

YourDialogFragment f = new YourDialogFragment(Context);
f.setStyle(...);
// and so on ...
person Philipp Jahoda    schedule 03.09.2013
comment
Направих го, но получавам функция за заявка за изключение, която трябва да бъде извикана преди добавяне на съдържание android - person Libathos; 04.09.2013
comment
Тогава, моля, публикувайте някакъв ваш код и вижте моя актуализиран отговор. - person Philipp Jahoda; 04.09.2013
comment
Когато изтрих onCreateView, той работи без грешки. Ако това ви помага - person Libathos; 04.09.2013
comment
onCreateView вече е публикуван. setStyle не е мой, а за API. Изтрих setStyle и не работи. - person Libathos; 04.09.2013
comment
Съжаляваме, но вашият метод onCreateView() не е публикуван. Само методът onCreate(). - person Philipp Jahoda; 04.09.2013
comment
Мисля, че е.. Превъртяхте ли? - person Libathos; 04.09.2013
comment
Хаха, бях твърде глупав, за да превъртя :) - Както и да е, мисля, че грешката ви е свързана със setStyle(...) вижте актуализирания ми отговор, моля. - person Philipp Jahoda; 04.09.2013
comment
Съжалявам, току-що забелязах, че сега получавам това изключение requestFeature() трябва да се извика преди добавяне на съдържание - person Libathos; 04.09.2013

Най-ясният начин.

// Your own onCreate_Dialog_View method
public View onCreateDialogView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.your_layout, container); // inflate here
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    // do something with 'view'
}

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // setup dialog: buttons, title etc
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity())
            .setTitle(R.string.dialog_fragment_author_title)
            .setNegativeButton(R.string.dialog_fragment_author_close,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            dialog.dismiss();
                        }
                    }
            );

    // call default fragment methods and set view for dialog
    View view = onCreateDialogView(getActivity().getLayoutInflater(), null, null);
    onViewCreated(view, null);
    dialogBuilder.setView(view);

    return dialogBuilder.create();
}
person Alexandr    schedule 10.04.2016

За да добавите бутони за действие, извикайте setPositiveButton() и setNegativeButton() методи:

public class FireMissilesDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setMessage(R.string.dialog_fire_missiles)
           .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // FIRE ZE MISSILES!
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // User cancelled the dialog
               }
           });
    // Create the AlertDialog object and return it
    return builder.create();
}
}

Повече информация за DialogFragment тук.

person amatellanes    schedule 03.09.2013

Това е малко старо, но напоследък отменям onCreateView, когато разширявам AppCompatDialogFragment. Просто поставете вашите собствени бутони в същото оформление, което връщате в onCreateView - използвайте стилове като @style/Widget.AppCompat.Button.Borderless.

Получавате допълнителен бонус от контролиране на самоотхвърлянето на диалоговия прозорец, когато се щракне върху бутон за действие, особено след като тези персонализирани изгледи понякога имат необходими входове и искате да блокирате автоматичното затваряне на диалоговия прозорец, когато се щракне върху бутон.

Използването на персонализиран изглед в onCreateDialog винаги се е чувствало мръсно, защото го раздувате без контейнер. Google се опита да направи API малко по-добър с новия v7 AlertDialog.Builder метод setView(int layoutResId), но тогава не можете да извикате findViewById.

Трябва да добавите тема като тази във вашия styles.xml:

<style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorPrimary">@color/material_light_blue_500</item>
    <item name="colorPrimaryDark">@color/material_light_blue_800</item>
    <item name="colorAccent">@color/material_light_blue_a400</item>
    <item name="colorButtonNormal">@color/material_light_blue_500</item>
    <item name="colorControlNormal">@color/material_light_blue_600</item>
    <item name="colorControlActivated">@color/material_light_blue_a100</item>
    <item name="colorControlHighlight">@color/material_light_blue_a100</item>
</style>

Трябва да замените onCreateDialog във вашия DialogFragment, за да върнете и new AppCompatDialog(getActivity(), R.style.AlertDialog).

person Anthony Chuinard    schedule 28.03.2017