Передача аргумента в DialogFragment

Мне нужно передать некоторые переменные в DialogFragment, поэтому я могу выполнить действие. Eclipse предполагает, что я должен использовать

Fragment#setArguments(Bundle)

Но я не знаю, как использовать эту функцию. Как я могу использовать его для передачи переменных в мой диалог?

Ответ 1

Используя newInstance

public static MyDialogFragment newInstance(int num) {
    MyDialogFragment f = new MyDialogFragment();

    // Supply num input as an argument.
    Bundle args = new Bundle();
    args.putInt("num", num);
    f.setArguments(args);

    return f;
}

И получим такие Args как

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mNum = getArguments().getInt("num");
    ...
}

См. полный пример здесь
http://developer.android.com/reference/android/app/DialogFragment.html

Ответ 2

как общий способ работы с фрагментами, как отметил JafarKhQ, вам не следует передавать параметры в конструкторе, но с Bundle.

встроенный метод для класса Fragment - setArguments(Bundle) и getArguments().

в основном, то, что вы делаете, настраивает пакет со всеми вашими элементами Parcelable и отправляет их.
в свою очередь, ваш фрагмент получит те элементы в нем onCreate и сделает это волшебство для них.

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

Ответ 3

Я использовал для отправки некоторых значений из своего списка

Как отправить

mListview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            Favorite clickedObj = (Favorite) parent.getItemAtPosition(position);

            Bundle args = new Bundle();
            args.putString("tar_name", clickedObj.getNameTarife());
            args.putString("fav_name", clickedObj.getName());

            FragmentManager fragmentManager = getSupportFragmentManager();
            TarifeDetayPopup userPopUp = new TarifeDetayPopup();
            userPopUp.setArguments(args);
            userPopUp.show(fragmentManager, "sam");

            return false;
        }
    });

и как получить внутри метода onCreate() диалогового окна

    Bundle mArgs = getArguments();
    String nameTrife = mArgs.getString("tar_name");
    String nameFav = mArgs.getString("fav_name");
    String name = "";

Ответ 4

В моем случае ни один из вышеприведенного кода с bundle-operate не работает; Вот мое решение (я не знаю, является ли он правильным кодом или нет, но он работает в моем случае):

public class DialogMessageType extends DialogFragment {
    private static String bodyText;

    public static DialogMessageType addSomeString(String temp){
        DialogMessageType f = new DialogMessageType();
        bodyText = temp;
        return f;
    };

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final String[] choiseArray = {"sms", "email"};
        String title = "Send text via:";
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(title).setItems(choiseArray, itemClickListener);
        builder.setCancelable(true);
        return builder.create();
    }

    DialogInterface.OnClickListener itemClickListener = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which){
                case 0:
                    prepareToSendCoordsViaSMS(bodyText);
                    dialog.dismiss();
                    break;
                case 1:
                    prepareToSendCoordsViaEmail(bodyText);
                    dialog.dismiss();
                    break;
                default:
                    break;
            }
        }
    };
[...]
}

public class SendObjectActivity extends FragmentActivity {
[...]

DialogMessageType dialogMessageType = DialogMessageType.addSomeString(stringToSend);
dialogMessageType.show(getSupportFragmentManager(),"dialogMessageType");

[...]
}