背景: 我在活动中有4个按钮。
我想要实现的目标: 单击每个按钮将显示完全相同的Dialog,其中包含5个项目的列表。单击列表中的项目将调用一个方法(在活动中定义),该方法包含2个参数:
这就是我想要实现的目标。我认为这是一种非常常见的情况,但在搜索一段时间后我找不到任何解决方案。
我正在尝试关注Android开发人员API指南: https://developer.android.com/guide/topics/ui/dialogs.html
如果我遵循指南,我将会有这样的事情:
public class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.dialog_title)
.setItems(R.array.dialog_array, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// something
}
});
return builder.create();
}
}
问题是我无法找到一种方法来传递一个值,该值指示单击了哪个按钮进入onClick
方法。当然,一种方法是为每个按钮创建4个不同的DialogFragment,但我相信这应该比这更清洁。我的第一个想法是创建一个DialogFragment Factory并为工厂的不同输入返回不同的匿名DialogFragment,但编译器抱怨说“片段应该是静态的”,显然是因为一些生命周期管理问题。当我在搜索时,我会遇到一些使用onCreateDialog
的示例,我认为这可以解决我的问题,但显然这种方法已被弃用...
我现在不知道(除了创建4个不同的DialogFragment)。非常感谢任何帮助!
答案 0 :(得分:0)
我有类似的东西,我通过使用静态方法解决了这个问题,该方法创建了一个对话框和一个用于检索结果的界面:
这是我的静态方法
public static void showGenericItemSelectorDialog(Activity activity, ArrayList<MyParams> items, final IReturnMyListItemToParent iReturnMyListItemToParent) {
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setCancelable(true);
LayoutInflater inflater = activity.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.dialog_searchable_list, null); //or init it howerer you want, I have a custom layout
builder.setView(dialogView);
final Dialog dialog = builder.create();
/// omitted not useful code
Button myBtn= (Button) dialogView.findViewById(R.id.myBtn);
myBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//check which item has been clicked
iReturnMyListItemToParent.onResult(myClickedItem);
dialog.dismiss();
}
});
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
iReturnMyListItemToParent.onResult(null);
dialog.dismiss();
}
});
dialog.show();
}
这是我的界面
public interface IReturnMyListItemToParent {
void onResult(MyItem item);
}
这就是我所说的:
RuntimeHelper.showGenericItemSelectorDialog(getActivity(), myParams, new IReturnMyListItemToParent() {
@Override
public void onResult(MyItem result) {
//do stuff with that result item clicked
}
});
这是一个例子,但这样你就可以通过从每个按钮调用静态方法来做任何你想做的事情。
这样我就将你的&#34;传递按钮更改为适配器&#34;将结果传递给按钮。
如果要将按钮传递给方法,只需在构造函数中添加一个指向单击按钮的参数:)
希望这有帮助