DialogFragment без FragmentActivity

Можно ли использовать DialogFragment при использовании Activity вместо FragmentActivity? Для методов show() требуется FragmentManager.

Я хочу реализовать диалог, который содержит только один EditText, и в учебниках для разработчиков Android говорится, что мне нужно использовать собственный макет для фрагмента диалога. Поэтому я спросил, потому что мне не хочется переходить на использование FragmentActivity только для 1 диалога.

РЕШЕНО: я решил просто использовать FragmentActivity вместо Activity, чтобы не усложнять задачу.


person Christopher Francisco    schedule 24.06.2013    source источник
comment
Пожалуйста, отредактируйте свой вопрос, потому что он недостаточно ясен. Вы пытаетесь реализовать свой DialogFragment, расширив класс Activity?   -  person Marek    schedule 25.06.2013
comment
Нет, я пытался использовать DialogFragment в пользовательском классе, который расширяет Activity. В учебниках говорится, что пользовательский класс должен расширять FragmentActivity вместо Activity. Поэтому я спросил, могу ли я сделать это, расширив Activity.   -  person Christopher Francisco    schedule 25.06.2013
comment
Вы пытались это сделать? Столкнулись с проблемами?   -  person Marek    schedule 25.06.2013


Ответы (5)


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

public void show_dialog() {
    FragmentManager fm = getFragmentManager();
    DialogFragment newFragment = new DialogFragment();
    newFragment.show(fm, "abc");
}

Для этого просто требуется импорт FragmentManager, а не FragmentActivity.

person shadyinside    schedule 17.02.2014
comment
Если вы используете библиотеку поддержки V7, вам нужно вместо этого вызвать getSupportFragmentManager(). Большое тебе спасибо! - person William T. Mallard; 08.07.2014
comment
Примечание! Требуется минимальный уровень API 11 - person Ayaz Alifov; 22.07.2016

Может быть, немного поздно, но у меня также была проблема с вызовом DialogFragment из не FragmentActivity. Также не имеет смысла делать FragmentActivity только для простого диалога. Поэтому решение для меня состояло в том, чтобы сделать интерфейс с обратным вызовом недействительным, чтобы получить ответ DialogFragment в действии. Для меня лучше получить ответ рядом с диалоговым вызовом, а не где-то в переопределении onActivityResult.

Интерфейс:

   import android.os.Parcelable;

/**
 * Created by TH on 03.11.2015.
 */
public interface OnDialogResponseListener extends Parcelable {

    void onDialogResponse(int responseCode);

}

Общий класс диалога:

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;

/**
 * Code basisc found here:
     *   http://stackoverflow.com/questions/7977392/android-dialogfragment-vs-dialog
* changed by TH on 03.11.2015.
     */
public class YesNoDialog extends DialogFragment
{

    public static final String TITLE="title";
    public static final String MESSAGE="message";
    public static final String LISTENER="listener";
    public static final String YES="yes";
    public static final String NO="no";
    public static final String ICON_ID="icon_id";
    private OnDialogResponseListener mResponseListener;

    public YesNoDialog()
    {

    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Bundle args = getArguments();
        String title = args.getString(TITLE, "");
        String message = args.getString(MESSAGE, "");
        String yes = args.getString(YES, "");
        String no = args.getString(NO, "");
        int iconID=args.getInt(ICON_ID);
        mResponseListener=args.getParcelable(LISTENER);

        return new AlertDialog.Builder(getActivity())
                .setTitle(title)
                .setMessage(message)
                .setIcon(iconID)
                .setPositiveButton(yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (mResponseListener != null) {
                            mResponseListener.onDialogResponse(Activity.RESULT_OK);
                        }

                    }
                })
                .setNegativeButton(no, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (mResponseListener != null) {
                            mResponseListener.onDialogResponse(Activity.RESULT_CANCELED);
                        }
                    }
                })
                .create();
    }
}

И использование будет таким:

OnDialogResponseListener onDialogResponseListener=new OnDialogResponseListener() {


                @Override
                public int describeContents() {
                    return 0; //Leave this as it is
                }

                @Override
                public void writeToParcel(Parcel dest, int flags) {
                        //Leave this as it is
                }

                @Override
                public void onDialogResponse(int responseCode) {


                    //Do what you want with your dialog answers

                    if(responseCode== Activity.RESULT_OK){
                        Toast.makeText(MovementActivity.this,"OK pressed",Toast.LENGTH_LONG).show();
                    }else if(responseCode==Activity.RESULT_CANCELED){
                        Toast.makeText(MovementActivity.this,"CANCEL pressed",Toast.LENGTH_LONG).show();
                    }

                }
            };


            YesNoDialog dialog = new YesNoDialog();
            Bundle args = new Bundle();
            args.putInt(YesNoDialog.ICON_ID, R.drawable.ic_action_add_light);
            args.putString(YesNoDialog.YES, getString(R.string.action_add));
            args.putString(YesNoDialog.NO, getString(R.string.action_cancel));
            args.putString(YesNoDialog.TITLE, getString(R.string.dialog_title_add_item));
            args.putString(YesNoDialog.MESSAGE, getString(R.string.dialog_message_add_item));
            args.putParcelable(YesNoDialog.LISTENER, onDialogResponseListener);
            dialog.setArguments(args);
            dialog.show(getSupportFragmentManager(), "tag");

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

person Tarik Huber    schedule 03.11.2015

Очень очень просто, просто используйте getSupportFragmentManager()

DialogConfirmRequest dialogConfirmRequest = new DialogConfirmRequest("Sem conexão com a internet");
dialogConfirmRequest.setCancelable(true);
dialogConfirmRequest.show(getSupportFragmentManager() ,"meudialog");
person Stênio Barroso de Moraes    schedule 01.01.2021
comment
С 2021 года вместо принятого ответа должно быть так — getFragmentManager() больше не работает. - person Muz; 15.04.2021

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

person Steven Mann    schedule 25.06.2013

У меня была та же проблема, но мне удалось исправить ее с помощью ответов в сообщении о переполнении стека, ссылка на которое приведена ниже. Мне особенно понравилось решение mrolcsi с концепцией слушателя положительного/отрицательного результата, которая, по моему мнению, дала очень аккуратный результат.

Получить значение из DialogFragment

person Mattias    schedule 08.04.2015