Повторно подключите ClickListeners после воссоздания FragmentDialog - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь создать 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.

Есть ли лучший способ сделать это?

...