Android DialogFragment newInstance可选参数

时间:2017-01-01 18:38:33

标签: java android dialogfragment

我一直关注官方android developer docuthis one,以便在我的项目中使用DialogFragment。到目前为止一直很好,因为我必须将数据传递给DialogFragment才能创建多选列表,我通过newInstance方法从我的MainActivity中调用DialogFragment(传递项目),我得到了正确的结果。现在,我想传递另一个参数,也是DialogFragment的数据,但它必须是可选的,因为我不需要一直传递它。我有办法实现这个目标吗?

修改
所以我从下面的评论中获取了建议并创建了一个setter并传递了我希望传递给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();
}

2 个答案:

答案 0 :(得分:4)

可选参数可以这样完成:

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,只需检查默认值(我认为它在API文档中为0)

答案 1 :(得分:-2)

我明白了,已经回答了 - 有趣的是当我用谷歌搜索时我没有找到它。

  

有最简单的方法可以做你想做的事,但让我们采取这种方法:   正如您所注意到的,setMultiChoiceItems()方法接收String []作为DialogFragment的项目,并接收boolean []来定义它们是否被选中。我们将使用这个数组来坚持我们的选择。此数组必须与items数组具有相同的长度,并且最初将设置为false。

所以我所要做的就是创建一个boolean[] itemsChecked并将正确的索引设置为true,以重新检查正确的复选框。

原始问题dilate this boolean array - 归功于@ joao2fast4u