Я пытаюсь создать DialogManager для всех моих DialogFragments . Идея в том, что я скажу DialogManager показать диалог с определенной конфигурацией. DialogManager покажет этот конкретный диалог. DialogManager - это Singletone класс
Я создаю конфигурацию, для которой мне нужен диалог с помощью Pattern Builder.
Вот простая версия кода.
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
и вручную установите слушателей. Но я не хочу прямого общения между диалогом и деятельностью. Я не хочу, чтобы моя BaseDialog
зависела от конкретной деятельности. Я хочу установить все настройки через Builder
.
Есть ли лучший способ сделать это?