我一直关注官方android developer docu和this 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();
}
答案 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