Дополнительные параметры Android DialogFragment newInstance

Я следил за официальным документом для разработчиков Android и < href="https://developer.android.com/reference/android/app/DialogFragment.html" rel="nofollow noreferrer">этот для использования DialogFragment внутри моего проекта. пока все хорошо, так как мне нужно передать данные в DialogFragment, чтобы он создал список с множественным выбором, я вызываю DialogFragment из моей MainActivity с помощью метода newInstance (передавая элементы) и получаю правильный результат. Теперь я хотел бы передать еще один аргумент, а также данные для DialogFragment, но он должен быть необязательным, поскольку мне не нужно передавать его все время. Есть ли способ для меня достичь этого?

EDIT:
поэтому я воспользовался советом из комментариев ниже, создал сеттер и передал элементы, которые хотел передать, в DiagramFragment. Это сработало просто отлично, к сожалению, это не помогло мне решить мою проблему. Причина, по которой я хотел передать вторые данные, заключается в том, что я подумал, что если пользователь открывает DialogFragment и делает выбор, а после этого снова открывает DialogFragment, его последний выбор исчезает. Я хотел проверить флажки, которые он уже проверил программно, передав проверенный один раз обратно в DialogFragment, а затем установив правильные индексы обратно в mSelectedItems, но даже если индексы установлены правильно, флажки остаются не отмеченными. есть обходной путь?

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;
}

...

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    mSelectedItems = new ArrayList();  // Where we track the selected items
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Set the dialog title
    builder.setTitle(R.string.pick_toppings)
    // Specify the list array, the items to be selected by default (null for none),
    // and the listener through which to receive callbacks when items are selected
           .setMultiChoiceItems(R.array.toppings, null,
                      new DialogInterface.OnMultiChoiceClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which,
                       boolean isChecked) {
                   if (isChecked) {
                       // If the user checked the item, add it to the selected items
                       mSelectedItems.add(which);
                   } else if (mSelectedItems.contains(which)) {
                       // Else, if the item is already in the array, remove it
                       mSelectedItems.remove(Integer.valueOf(which));
                   }
               }
           })
    // Set the action buttons
           .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   // User clicked OK, so save the mSelectedItems results somewhere
                   // or return them to the component that opened the dialog
                   ...
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   ...
               }
           });

    return builder.create();
}

person b101    schedule 01.01.2017    source источник
comment
установщики стандартов, возможно   -  person    schedule 01.01.2017
comment
Как насчет того, чтобы просто передать null? Когда он недоступен   -  person Oleg Bogdanov    schedule 01.01.2017
comment
@JawadLeWywadi это возможно? как бы я использовал эту функцию установки DialogFragment newFragment = MyDialogFragment.newInstance(items);, а затем newFragment.setMySetter(value);? как это ??   -  person b101    schedule 01.01.2017
comment
@OlegBogdanov попробует. Если это работает, меня все устраивает   -  person b101    schedule 01.01.2017
comment
хорошо, я использовал оба ваших совета, и они работают, но, к сожалению, не решили мою проблему. Я отредактирую свой вопрос и дам более подробную информацию об этом.   -  person b101    schedule 01.01.2017
comment
ПОКАЖИТЕ НАМ НЕКОТОРЫЙ КОД, МУЖЧИНА   -  person Blundell    schedule 01.01.2017
comment
@Blundell, как я уже сказал, я следовал документу по Android, и приведенный выше код в основном является кодом, который я использовал. Выключи свои дерьмовые заглавные буквы   -  person b101    schedule 01.01.2017
comment
нажимает на ссылку не видит newInstance методов, CTL+F для newInstance находит 0   -  person Blundell    schedule 01.01.2017
comment
также в добавленном вами коде я не вижу newInstance или необязательных параметров, о которых вы говорите. Это довольно легко сделать, но я изо всех сил пытаюсь понять, где вы пытаетесь это сделать.   -  person Blundell    schedule 01.01.2017


Ответы (2)


необязательный параметр можно сделать следующим образом:

static MyDialogFragment newInstance() {
        return newInstance(-1);
}

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;
}

Вы можете позвонить newInstance(), если у вас нет номера, или newInstance(300), если он у вас есть.

С другой стороны:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
     int num = getArguments().getInt("num");
     if(num == -1) {
       // no extra number
     } else {
       // do something with the extra number
     }

...

В качестве альтернативы вместо использования -1 вы можете вообще не добавлять Int и просто проверить значение по умолчанию (я думаю, что это 0 в документах API)

person Blundell    schedule 01.01.2017

Я понял, на него уже ответили - забавно, я не нашел его, когда гуглил..

Есть самые простые способы сделать то, что вы хотите, но давайте воспользуемся этим подходом: как вы заметили, метод setMultiChoiceItems() получает String[] в качестве элементов вашего DialogFragment и логическое значение [], чтобы определить, проверены они или нет. Мы собираемся использовать этот массив для сохранения нашего выбора. Этот массив должен иметь ту же длину, что и массив элементов, и изначально для него будет установлено значение false.

Так что все, что мне нужно было сделать, это создать boolean[] itemsChecked и установить правильные индексы в true, чтобы повторно проверить правильные флажки.

Исходный вопрос Persist AlertDialog проверенные параметры - все кредиты @joao2fast4u

person b101    schedule 01.01.2017