我正在尝试为我的所有 DialogFragments 创建一个 DialogManager 。想法是,我将告诉DialogManager显示具有特定配置的对话框。 DialogManager将显示该特定对话框。 DialogManager是 Singletone 类
我正在通过“构建器模式”为我想要的对话框构建配置。
这是简单的代码版本。
DialogManager:
public class DialogManager {
public static DialogManager getInstance(){
.....................
.......................
}
public void show(FragmentManager fragmentManager, BaseFragment.Builder builder){
BaseFragment fragment = new BaseFragment();
fragment.setBuilder(builder);
fragment.show(fragmentManager, fragment.getClass().getSimpleName());
}
}
BaseDialog:
public class BaseFragment extends AppCompatDialogFragment {
public void setBuilder(Builder builder){
type = builder.type;
clickListener = builder.clickListener;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView;
if (type == 1) {
rootView = inflater.inflate(R.layout.fragment_base, container, false);
}else if (type == 2){
rootView = inflater.inflate(R.layout.dialog_fragmnet2, container, false);
}else {
rootView = inflater.inflate(R.layout.fragment_base, container, false);
}
return rootView;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Dialog dialog = super.onCreateDialog(savedInstanceState);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
.setPositiveButton("Ok", this.clickListener);
Dialog dialog = builder.create();
return dialog;
}
public static class Builder{
private int type;
private DialogInterface.OnClickListener clickListener;
public Builder clickListener(DialogInterface.OnClickListener clickListener){
this.clickListener = clickListener;
return this;
}
public Builder type(int type){
this.type = type;
return this;
}
}
}
在“活动”中,我正在显示对话框
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BaseFragment.Builder builder = new BaseFragment.Builder()
.type(2)
.clickListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
DialogManager.getInstance().show(getSupportFragmentManager(), builder);
}
});
对于不同类型的对话框,这可以正常工作。但是当重新创建Activity时,我遇到了一个问题。由于我使用的是 DialogFragment ,所以也可以很好地重新创建Dialog。
但是新对话框没有自动创建的监听器。如何将我的自定义 ClickListeners 附加到重新创建的对话框,以便在重新创建Activity后可以捕获事件。
一种解决方案是:如果saveInstanceState不是null
,则通过findFragmentByTag
方法获取当前重新创建的对话框并手动设置侦听器。但是我不希望Dialog和Activity之间直接通信。我不希望我的BaseDialog
取决于特定的活动。我想通过Builder
设置所有配置。
还有更好的方法吗?